0

そのため、StAX を使用して一連の XML ドキュメントに対してデータ クリーニングを行っています。私は基本的にドキュメントを読み込んで、いくつかのタグが欠落しているまったく同じドキュメントを吐き出したいと思っています。私が抱えている問題は、有効な XML を出力していないことです。

左側に私の出力、右側に元のドキュメントが表示されます [ここ] ( http://imgur.com/a/oFxZd )。下部の画像も xmllint -valid からの出力です。ご覧のとおり、DTD が見つからず、ドキュメントの最後に余分なコンテンツがあることがわかります。

ライターを実装する私のコードはこれです

public XMLEventWriter setUpWriter(File blah) throws FileNotFoundException,                XMLStreamException {
    newFileName = thef.getName().substring(0, thef.getName().indexOf("_") + 1);

    try {
        writer = outputFactory
                .createXMLEventWriter(new FileOutputStream(newFileName + "mush.xml"), "UTF-8");

    } catch (XMLStreamException ex) {
        ex.printStackTrace();
        System.out.println("There was an XML Stream Exception, whatever that means for writer");
    }
    //outputFactory.setProperty("escapeCharacters", false);
    eventFactory = XMLEventFactory.newInstance();
    StartDocument startDocument = eventFactory.createStartDocument();

    writer.add(startDocument);
    //writer.add("<!DOCTYPE DjVuXML>");
    return writer;
}

これは、実際の書き込みを処理する私のコードです。

 if (event.isStartElement()) { //first it looks for start elements
            StartElement se = event.asStartElement();
            if ("OBJECT".equals(se.getName().getLocalPart())) {
                writer.add(se);
            } else if ("MAP".equals(se.getName().getLocalPart())) {
                writer.add(se);
    } else if ("PARAM".equals(se.getName().getLocalPart())) {
                writer.add(se);
            } else if ("LINE".equals(se.getName().getLocalPart())) {
                writer.add(se);
            } else if ("DjVuXML".equals(se.getName().getLocalPart())) {
                writer.add(se);
            }else if ("WORD".equals(se.getName().getLocalPart())) {
                    word.text = reader.getElementText();

                    EndElement wordEnd = eventFactory.createEndElement("", "", "WORD");
                    writer.add(se);
                    Characters characters = eventFactory.createCharacters(word.text);
                    writer.add(characters);
                    writer.add(wordEnd);
                }

            }

        } else if (event.isEndElement()) {

            EndElement ee = event.asEndElement();
            if ("MAP".equals(ee.getName().getLocalPart())) {
                writer.add(ee);

            } else if ("DjVuXML".equals(ee.getName().getLocalPart())) {
                writer.add(ee);
            } else if ("LINE".equals(ee.getName().getLocalPart())) {
                writer.add(ee);
            }
            else if ("BODY".equals(ee.getName().getLocalPart())) {
                writer.add(ee);
            }
        }

    }
    writer.flush();
    writer.close();

邪魔にならないようになったので、私の質問は2つあります。

1) DTD がないため、私の出力は有効ではありませんか?

1a) はいの場合、DTD を含めるにはどうすればよいですか? いや言われてもずっと悩んでた

2)DTDではない場合、どうすればこのことを有効にできますか。

ご協力いただきありがとうございます!!

4

1 に答える 1

0

1) DTD がないため、私の出力は有効ではありませんか?

簡単な答え: 理論的には、イエスかもしれませんし、ノーかもしれません。実際には、はい。

XML 仕様では、有効性は次のように定義されています。

関連する文書型宣言があり、その中で表現されている制約に文書が準拠している場合、XML文書は有効です。

一部の読者は、ドキュメントが DTD の制約に従っている場合にのみ、ドキュメントが DTD に対して有効であることを意味すると解釈します。その意味で、ドキュメント タイプ宣言のないドキュメントは、指定された DTD に対して有効である可能性があり、ドキュメント タイプ宣言を含むドキュメントは、そのドキュメント タイプ宣言で指定された DTD に対して、またはその他の指定された DTD に対して有効である可能性があります。または、場合によっては無効です。

他の読者は、この定義を、文書型宣言がない限り (少なくとも厳密な意味では) 文書が有効ではないこと、および有効性の問題は、文書の宣言によって指定された文書型定義に関してのみ意味があることを意味すると解釈します。文書型宣言。

実際には、検証対象の DTD を見つける場所を検証パーサーに指示しない限り、パーサーは 2 番目のより制限的なビューを取るしかありません。DTD が見つからない場合、どのようにドキュメントを検証できますか? (検証パーサーには、DTD を指す実行時パラメーターを受け入れるものと、受け入れないものがあります。)

1a) はいの場合、DTD を含めるにはどうすればよいですか? いや言われてもずっと悩んでた

StAX リファレンス実装の JavaDocsから、まるでwriteDTD(string)友達のように見えます。

2)DTDではない場合、どうすればこのことを有効にできますか。

「exta content」に関するメッセージが表示された場合、出力が有効ではないだけでなく、整形式ではない可能性があります。最初にそれを確認して修正します。

「extra content」エラー メッセージの原因として考えられるのは、ルート要素を途中で閉じたか、ルート要素がまったくないことです。

于 2014-12-08T16:16:24.297 に答える