4

Javaでxmlファイルを生成する必要があるので、DOMを使用することを選択しました(すべてが問題になるまで)。これが、作成する必要のあるもののルートタグです。

<?xml version="1.0" encoding="utf-8"?>
<KeyContainer Version="1.0" xmlns="urn:ietf:params:xml:ns:keyprov:pskc:1.0" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" xmlns:xml="http://www.w3.org/XML/1998/namespace">

これが私のソースコードです

PrintWriter out = new PrintWriter(path);
Document xmldoc = null;
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        DOMImplementation impl = builder.getDOMImplementation();
        Element e = null;
        Node n = null;
        xmldoc = impl.createDocument(null, "KeyContainer", null);
        /* Noeuds non bouclés */
        Element keycontainer = xmldoc.getDocumentElement();
            keycontainer.setAttributeNS(null, "Version", "1.0");
            keycontainer.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:ds","http://www.w3.org/2000/09/xmldsig#");
            keycontainer.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:xenc", "http://www.w3.org/2001/04/xmlenc#");
            keycontainer.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:xml", "http://www.w3.org/XML/1998/namespace");
            keycontainer.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns", "urn:ietf:params:xml:ns:keyprov:pskc:1.0");
/* Non relevant Info*/
DOMSource domSource = new DOMSource(xmldoc);
        StreamResult streamResult = new StreamResult(out);
        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer serializer = tf.newTransformer();
        serializer.setOutputProperty(OutputKeys.ENCODING,"utf-8");
        serializer.setOutputProperty(OutputKeys.VERSION,"1.0");
        serializer.setOutputProperty(OutputKeys.INDENT,"yes");
        serializer.setOutputProperty(OutputKeys.STANDALONE,"yes");
        serializer.transform(domSource, streamResult); 

そして、これが私が得るものです

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<KeyContainer xmlns="" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" Version="1.0">

問題は、xmlnsプロパティが空で、xmlns:xmlが欠落していることです。すべての情報を取得するにはどうすればよいですか?

たくさんのstackoverflowに感謝します

(追記: NamespaceURIフィールドに「 http://www.w3.org/2000/xmlns/ 」以外の場合はNAMESPACE_ERRを取得しました)

4

2 に答える 2

4

取り除くには2つのことが必要ですxmlns=""

Document次のように、目的の名前空間URIを使用してを作成します。

xmldoc = impl.createDocument("urn:ietf:params:xml:ns:keyprov:pskc:1.0", "KeyContainer", null);

次の行は不要になったため、削除してください。

keycontainer.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns", "urn:ietf:params:xml:ns:keyprov:pskc:1.0");

属性に関してはxmlns:xml、APIは黙ってそれを削除しています。の173行目を参照してくださいNamespaceMappings。少し調べてみると、特定の名前空間を宣言する動作は未定義であり、推奨されていないことがわかりました。

于 2009-08-18T18:46:05.237 に答える
4

setNamespaceAwareDOM名前空間を認識させるには、メソッドを使用してdocumentbuilderfactoryでDOM名前空間を有効にすることを忘れないでください。

于 2009-09-27T17:46:44.367 に答える