3

Java で W3C DOM APIを使用して、XML ドキュメントを読み取り、新しい XML ドキュメントに出力しようとしています。DOCTYPE を処理するために、次のコードを使用しています (入力 Documentdocからターゲット File へtarget):

TransformerFactory transfac = TransformerFactory.newInstance();
Transformer trans = transfac.newTransformer();
trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no"); // omit '<?xml version="1.0"?>'
trans.setOutputProperty(OutputKeys.INDENT, "yes");

// if a doctype was set, it needs to persist
if (doc.getDoctype() != null) {
    DocumentType doctype = doc.getDoctype();
    trans.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, doctype.getSystemId());
    trans.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, doctype.getPublicId());
}

FileWriter sw = new FileWriter(target);
StreamResult result = new StreamResult(sw);
DOMSource source = new DOMSource(doc);
trans.transform(source, result);

これは、DOCTYPE がある場合とない場合の両方の XML ドキュメントで問題なく機能します。ただし、NullPointerException次の入力 XML ドキュメントを変換しようとすると、次のようになります。

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE permissions >
<permissions>
  // ...
</permissions>

HTML 5 は、その DOCTYPE に同様の構文を使用しており、有効です。しかし、W3C DOM API を使用してこれを処理する方法がわかりません。例外DOCTYPE_SYSTEMnullスローするように設定しようとしています。W3C DOM API を使用して空の doctype を出力することはできますか?

4

2 に答える 2

4

この質問は 2 年前のものですが、一部の Web 検索エンジンで上位の検索結果になっているため、便利なショートカットになる可能性があります。http://www.w3.org/html/wg/drafts/html/master/syntax.html#doctype-legacy-stringを参照して XSLT で HTML5 doctype を設定するという質問を参照してください。

<!DOCTYPE html>短い DOCTYPE " " でHTML マークアップを出力できない HTML ジェネレーターのために、 DOCTYPE レガシー文字列を DOCTYPEに挿入することができます [...]

つまり、<!DOCTYPE html SYSTEM "about:legacy-compat">or <!DOCTYPE html SYSTEM 'about:legacy-compat'>は、一重引用符または二重引用符で囲まれた部分を除き、大文字と小文字を区別しません。

次のようなJavaコードの行につながります。

trans.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "about:legacy-compat");
于 2014-05-21T19:48:48.370 に答える
1

https://stackoverflow.com/a/6637886/116509の提案を試してください。基本的に、標準の Java DOM サポートではできないようです。

StAXを試すこともできます

    XMLStreamWriter xmlStreamWriter =
        XMLOutputFactory.newFactory().createXMLStreamWriter( System.out, doc.getXmlEncoding() );
    Result result = new StAXResult( xmlStreamWriter );
    // ... create dtd String 
    xmlStreamWriter.writeDTD( dtd );
    DOMSource source = new DOMSource( doc );
    trans.transform( source, result );

しかし、DTD パラメータが であり、オブジェクトStringしかないため、見苦しいです。DocumentType

于 2012-05-25T08:16:07.250 に答える