如何采用dom4j 循环增加xml节点,如下格式for循环取数据,循环一次创建一个xyList节点?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何采用dom4j 循环增加xml节点,如下格式for循环取数据,循环一次创建一个xyList节点?相关的知识,希望对你有一定的参考价值。

采用dom4j jar方式创建。
<?xml version="1.0" encoding="UTF-8" ?>
<count>3</count>
<xyList>
<xy>106.1236,38.49263;</xy>
<type>??????</type>
</xyList>
<xyList>
<xy>106.1236,38.49263;</xy>
<type>????????</type>
</xyList>
<xyList>
<xy>106.1236,38.49263;</xy>
<type></type>
</xyList>
我只要创建xml,我如下方式创建会报错,好像是Element 名字不能相同吧。
Document doc = DocumentHelper.createDocument();
for (Object[] object : lists)
Element root = doc.addElement("xyList");
root.addAttribute("x", object[0]);
root.addAttribute("y", object[1]);
root.addAttribute("type", object[2]);

参考技术A import java.util.*;  
import org.dom4j.*;  
  
public class testxml   
  
    public static void main(String[] args)   
        String xml =   
            " <file>                                " +   
            "     <chapter id=\\"1\\" name=\\"a\\"/>    " +  
            "     <chapter id=\\"2\\" name=\\"b\\"/>    " +  
            "     <chapter id=\\"3\\" name=\\"c\\"/>    " +  
            "     <chapter id=\\"4\\" name=\\"d\\"/>    " +  
            "  </file> "                            ;  
        try   
            //生产doc文档  
            Document doc = DocumentHelper.parseText(xml);  
            //得到根节点  
            Element root = doc.getRootElement();  
            //得到根节点下的chapter节点  
            List elements = root.elements("chapter");  
            //遍历chapter节点  
            Iterator iterator = elements.iterator();          
            while(iterator.hasNext())  
                Element e = (Element)iterator.next();  
                String id = e.attributeValue("id");  
                //如果id==1 则添加新的节点  
                if("1".equals(id) || "1" == id)  
                    //新添加的节点  
                    Element enew = e.addElement("chapterNew");  
                    //添加属性和值  
                    enew.addAttribute("id", "1.1");  
                    enew.addAttribute("name", "a.1");  
                  
              
            //打印  
            System.out.println(doc.asXML());  
         catch (DocumentException e)   
            e.printStackTrace();  
          
      

【求助】Dom4j 生成xml,节点增加属性时,属性值中有特殊字符,如何做到不转义

如下代码,生成的xml中,“leaf”节点有个key属性,其属性值为“a>b”,但是生成的xml将“>”转义成“>”了,求问如果做到不转义。

```
public static void main(String[] args)
Document document = DocumentHelper.createDocument();
Element root= document.addElement("root");
Element element = root.addElement("leaf");
String str = "a>b";
element.addAttribute("key", str);
OutputFormat outputFormat = OutputFormat.createPrettyPrint();
outputFormat.setEncoding("utf-8");
Writer writer;
try
writer = new FileWriter("a.xml");
XMLWriter xmlWriter = new XMLWriter(writer, outputFormat);
xmlWriter.setEscapeText(false);// 并不能解决问题!!!
xmlWriter.write(document);
xmlWriter.close();
catch (IOException e)
e.printStackTrace();


```
实际生成的xml:
<?xml version="1.0" encoding="utf-8"?>
<root>
<leaf key="a>b"/>
</root>
期望生成的xml:
<?xml version="1.0" encoding="utf-8"?>
<root>
<leaf key="a>b"/>
</root>

setEscapeText(false) 只是能改变 escapeElementEntities(String st) 中的参数,主要能改变文本里面如:
<root> aaaa>bbbb <root/> 中aaaa>bbbb的中的>不转变
对于Attribute 里面的特殊字符,我查了好久的原码发现人家里面是从
protected void writeEscapeAttributeEntities(String txt) throws IOException
if (txt != null)
String escapedText = escapeAttributeEntities(txt);
writer.write(escapedText);

//(在XMLWriter类中第1174行)
里面有个 escapeAttributeEntities(txt); 这个是专门用来转变Attribute 里面的特殊字符的,
所以要想解决这个问题,我是用了继承,写了一个
public class MyXMLWriter extends XMLWriter
......
protected void writeEscapeAttributeEntities(String txt) throws IOException
if (txt != null)
//String escapedText = escapeAttributeEntities(txt);
writer.write(txt);


.......

直接注释了原码中的//StringescapedText=escapeAttributeEntities(txt);
就完美解决了。
参考技术A 我通过Dom4j读取file节点的append属性值的时候,当该节点没有设置append的值,读取的数据为空,但我想当没有显示声明值的时候,读取到的是xsd文件中设置的默认值,有人做过类

以上是关于如何采用dom4j 循环增加xml节点,如下格式for循环取数据,循环一次创建一个xyList节点?的主要内容,如果未能解决你的问题,请参考以下文章

dom4j解析无根节点的xml

dom4j 添加节点

dom4j解析xml重复节点

根据节点的绝对路径创建Xml

想在xml中插入一个节点,该节点内容如下<#list sources as source></#list>,使用的是java的dom4j

xml 转map dom4j