2017-07-12 50 views
0

我正在尋找一個Java庫,它可以採用XSD架構並創建一個示例XML文檔,然後可以對其進行操作。在我的簡單例子中,我給了一個XML,我加載,操作和打印。我如何才能達到相同的結果,如果我只有一個XSD?在Java中使用XSD創建XML文檔的實例

String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + 
       "<ns0:store_msg xmlns:ns0=\"http://data\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://data sample.xsd \">" + 
       "<item>" + 
       "<name>A</name>" + 
       "<price>1.1</price>" + 
       "</item>" + 
       "<item>" + 
       "<name>B</name>" + 
       "<price>2.2</price>" + 
       "</item>" + 
       "</ns0:store_msg>"; 

    // load XML 
    DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder builder = builderFactory.newDocumentBuilder(); 
    Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes())); 


    // manipulate XML 
    Node root = doc.getFirstChild(); 
    Element el = doc.createElement("item"); 
    Element name = doc.createElement("name"); 
    Element price = doc.createElement("price"); 
    name.setTextContent("C"); 
    price.setTextContent("2.2"); 
    el.appendChild(name); 
    el.appendChild(price); 
    root.appendChild(el); 

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

    transformer.transform(new DOMSource(doc), 
     new StreamResult(new OutputStreamWriter(System.out, "UTF-8"))); 
+0

你應該使用JAXB:https://github.com/javaee/jaxb-v2 –

+0

同意 - 使用JAXB。 https://dzone.com/articles/introduction-to-jaxb-20 –

+0

感謝您的回覆。我對使用JAXB有點困惑。請回答新手問題,但JAXB會在運行時之外生成POJO的源代碼,然後可以編譯和使用這個非編組代碼,或者JAXB可以基於給出的架構在運行時實際創建對象,並且可以操作和編組此對象到原始的XML中,讓我們說,一個文件? – VilleLipponen

回答

1
A.

使用JAXB(優選):

  1. 預步驟:產生由行家-JAXB2-插件或與其他工具或手動調用JAXB Java類你的XSD的,如實施例XJC編譯器

  2. 當你需要的類創建您的根元素:

    StoreMsg myStoreMsgRoot = new StoreMsg(); // Class must be what JAXB generated for store_msg element

  3. 根據需要填充需要的元素。作爲例子:

    Item firstItem = new Item(); 
    firstItem.setName("A"); 
    firstItem.setPrice(1.1); 
    myStoreMsgRoot.getItem().add(firstItem); 
    

  4. 然後向JAXBContext元帥根元素例如爲String

    JAXBContext jaxbCtx = JAXBContext.newInstance(StoreMsg.class);
    ByteArrayOutputStream bos = new ByteArrayOutputStream(); jaxbCtx.createMarshaller().marshal(myStoreMsgRoot, bos); String generatedXml = new String(bos.toByteArray()); bos.close();

B.有一個框架,這樣做 - jlibs

簡單的例子是在這裏:jlibs - XSInstance.wiki

除此之外,你可能需要設置一堆的屬性來處理案件@VCR評論有關。

從第一眼看,它以某種方式工作。

只是最新版本需要依賴(基於Maven如下或jar文件在classpath中):

<!-- https://mvnrepository.com/artifact/in.jlibs/jlibs-xsd --> 
    <dependency> 
     <groupId>in.jlibs</groupId> 
     <artifactId>jlibs-xsd</artifactId> 
     <version>2.2.1</version> 
    </dependency> 

    <!-- https://mvnrepository.com/artifact/in.jlibs/jlibs-xml --> 
    <dependency> 
     <groupId>in.jlibs</groupId> 
     <artifactId>jlibs-xml</artifactId> 
     <version>2.1</version> 
    </dependency> 

    <dependency> 
     <groupId>xerces</groupId> 
     <artifactId>xerces</artifactId> 
     <version>2.4.0</version> 
    </dependency> 

    <dependency> 
     <groupId>xerces</groupId> 
     <artifactId>xercesImpl</artifactId> 
     <version>2.11.0-22</version> 
    </dependency>