2012-11-19 132 views
0

我有一个我想要转换为xml的字符串列表。我将如何使用DOM?我不确定如何使用字符串创建一个文档来用作Source来生成XML。从字符串创建XML

任何人都可以给我看一个示例代码来生成一个文档? 例如,XML会是这样:

ArrayList<String> fruits 

<Fruits> 
    <fruit>Apple<fruit> 
    <fruit>Grape<fruit> 
<Fruits> 

我认为,代码如下:

TransformerFactory transFact = TransformerFactory.newInstance(); 
Transformer serializer = transFact.newTransformer(); 
Properties props = new Properties(); 
props.put("method", "xml"); 
props.put("indent", "yes"); 
serializer.setOutputProperties(props); 
Source source = new DOMSource(document); //need to create a document 
Result result = new StreamResult(PrintWriter); 

回答

3
ArrayList<String> a = new ArrayList<String>(); 
    a.add("apple"); a.add("mango"); 

    DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); 

    Document doc = docBuilder.newDocument(); 
    Element root = doc.createElement("Fruits"); 
    doc.appendChild(root); 

    for(String name: a){ 
     Element fruit = doc.createElement("fruit"); 
     fruit.appendChild(doc.createTextNode(name)); 
     root.appendChild(fruit); 
    } 
    TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
    Transformer transformer = transformerFactory.newTransformer(); 
    DOMSource source = new DOMSource(doc); 
    StreamResult result = new StreamResult(new File("C:\\file.xml")); 

    transformer.transform(source, result); 
+0

结果不是我所期望的。输出为' applegrapepeanut'。我希望每个水果都在一个单独的''标签 – Dan

+0

中,您可能会做错某些事情。看看我更新的答案,我已经删除了评论并添加了迭代器代码。 –

+0

谢谢,发现我的错误。 – Dan

1

我会用JAXB此:

@XmlRootElement(name = "Fruits") 
@XmlAccessorType(XmlAccessType.FIELD) 
public static class Fruits 
{ 
    @XmlElement(name = "fruit") 
    public List<String> fruit = new ArrayList<String>(); 
} 

public static void main(String[] args) throws Exception 
{ 
    Fruits fruits = new Fruits(); 
    fruits.fruit.add("Apple"); 
    fruits.fruit.add("Grape"); 

    TransformerFactory transFact = TransformerFactory.newInstance(); 
    Transformer serializer = transFact.newTransformer(); 
    Properties props = new Properties(); 
    props.put("method", "xml"); 
    props.put("indent", "yes"); 
    serializer.setOutputProperties(props); 
    Source source = new JAXBSource(JAXBContext.newInstance(Fruits.class), fruits); 
    Result result = new StreamResult(System.out); 
    serializer.transform(source, result); 
} 
+1

使用JAXB(JSR-222)实现,您可以使用Marshaller将对象写入所需的XML输出,而不是使用“Transformer”。将样式表应用于JAXB源代码时,您提供的方法很有用:http://blog.bdoughan.com/2012/11using-jaxb-with-xslt-to-produce-html.html –

+0

@BlaiseDoughan确实,我只是复制了OP的片段。否则我只会使用'JAXB.marshal(fruits,System.out)'。 – artbristol

0

如果你真的想要在“水果”列表中使用字符串创建一个Document作为来源:

StringBuilder sb = new StringBuilder(); 
    for(String s : fruits) { 
     sb.append(s).append('\n'); 
    } 
    DocumentBuilderFactory f = DocumentBuilderFactory.newInstance(); 
    Document doc = f.newDocumentBuilder().parse(new InputSource(new StringReader(sb.toString())));