2017-07-30 4 views
-1

私はいくつかの古い答えを見てきましたが、この特定のケースの解決策は見つかりません。私は次の出力を探していますJavaでのXMLネームスペースの作成

:だから

<?xml version="1.0" encoding="UTF-8"?> 
<manifest:manifest xmlns:manifest="urn:oasis:names:tc:opendocument:xmlns:manifest:1.0" manifest:version="1.2"> 
<manifest:file-entry manifest:full-path="/" manifest:version="1.2" manifest:media-type="application/vnd.oasis.opendocument.spreadsheet"/> 
</manifest:manifest> 

、私は次のコードを試してみました:

import org.w3c.dom.Document; 
import org.w3c.dom.Element; 

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.ParserConfigurationException; 
import javax.xml.transform.OutputKeys; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerException; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.dom.DOMSource; 
import javax.xml.transform.stream.StreamResult; 
import java.io.FileOutputStream; 
import java.io.IOException; 

public class Test { 
    public static void main(String args[]){ 
     final String MIMETYPE = "application/vnd.oasis.opendocument.spreadsheet"; 
     try { 
      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
      DocumentBuilder db = dbf.newDocumentBuilder(); 
      Document dom = db.newDocument(); 
      Element e = null; 

      Element rootEle = dom.createElementNS("manifest","manifest"); 
      rootEle.setAttributeNS("manifest","version","1.2"); 
      rootEle.setAttributeNS("xmlns","manifest","urn:oasis:names:tc:opendocument:xmlns:manifest:1.0"); 

      e = dom.createElementNS("manifest","file-entry"); 
      e.setAttributeNS("manifest","full-path","/"); 
      e.setAttributeNS("manifest","version","1.2"); 
      e.setAttributeNS("manifest","media-type",MIMETYPE); 
      rootEle.appendChild(e); 

      dom.appendChild(rootEle); 

      try { 
       Transformer tr = TransformerFactory.newInstance().newTransformer(); 
       tr.setOutputProperty(OutputKeys.INDENT, "yes"); 
       tr.setOutputProperty(OutputKeys.METHOD, "xml"); 
       tr.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); 
       tr.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4"); 

       FileOutputStream o = new FileOutputStream("Output.xml"); 
       tr.transform(new DOMSource(dom), 
         new StreamResult(o)); 

       o.close(); 
      } catch (TransformerException te) { 
       System.err.println(te.getMessage()); 
      } catch (IOException ioe) { 
       System.err.println(ioe.getMessage()); 
      } 
     } catch (ParserConfigurationException pce) { 
      System.err.println("UsersXML: Error trying to instantiate DocumentBuilder " + pce); 
     } 
    } 
} 

私は次の出力を得る:それはめちゃくちゃだ

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<manifest xmlns:ns0="xmlns" ns0:manifest="urn:oasis:names:tc:opendocument:xmlns:manifest:1.0" xmlns:ns1="manifest" ns1:version="1.2" xmlns="manifest"> 
    <file-entry xmlns:ns0="manifest" ns0:full-path="/" ns1:media-type="application/vnd.oasis.opendocument.spreadsheet" xmlns:ns2="manifest" ns2:version="1.2"/> 
</manifest> 

を名前空間!どのように私は正しい出力を得ることができますか?

+0

あなたの質問に生成したい出力を追加してください。 – Progman

+0

@Progman私はすでに行った – amchacon

+0

すべての要素と属性は、(少なくともこの例では)スキップすることができますが、 "マニフェスト"プレフィックスを必要としますか? – Progman

答えて

1

set*NS(...)メソッドの最初の引数は、接頭辞ではなく名前空間URIでなければなりません。あなたの場合、それは "urn:oasis:names:tc:opendocument:xmlns:manifest:1.0"です。ただし、nameパラメータに接頭辞を指定することができます(また、指定する必要があります)。次のソースコードは、あなたが望む出力を生成します:

import org.w3c.dom.Document; 
import org.w3c.dom.Element; 

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.ParserConfigurationException; 
import javax.xml.transform.OutputKeys; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerException; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.dom.DOMSource; 
import javax.xml.transform.stream.StreamResult; 
import java.io.FileOutputStream; 
import java.io.IOException; 

public class Test { 
    public static void main(String args[]){ 
     final String MIMETYPE = "application/vnd.oasis.opendocument.spreadsheet"; 
     try { 
      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
      DocumentBuilder db = dbf.newDocumentBuilder(); 
      Document dom = db.newDocument(); 
      Element e = null; 

      String namespace = "urn:oasis:names:tc:opendocument:xmlns:manifest:1.0"; 

      Element rootEle = dom.createElementNS(namespace, "manifest:manifest"); 
      rootEle.setAttributeNS(namespace, "manifest:version","1.2"); 

      e = dom.createElementNS(namespace, "manifest:file-entry"); 
      e.setAttributeNS(namespace, "manifest:full-path","/"); 
      e.setAttributeNS(namespace, "manifest:version","1.2"); 
      e.setAttributeNS(namespace, "manifest:media-type",MIMETYPE); 
      rootEle.appendChild(e); 

      dom.appendChild(rootEle); 

      try { 
       Transformer tr = TransformerFactory.newInstance().newTransformer(); 
       tr.setOutputProperty(OutputKeys.INDENT, "yes"); 
       tr.setOutputProperty(OutputKeys.METHOD, "xml"); 
       tr.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); 
       tr.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4"); 

       FileOutputStream o = new FileOutputStream("Output.xml"); 
       tr.transform(new DOMSource(dom), new StreamResult(o)); 

       o.close(); 
      } catch (TransformerException te) { 
       System.err.println(te.getMessage()); 
      } catch (IOException ioe) { 
       System.err.println(ioe.getMessage()); 
      } 
     } catch (ParserConfigurationException pce) { 
      System.err.println("UsersXML: Error trying to instantiate DocumentBuilder " + pce); 
     } 
    } 
} 
関連する問題