将xml元素移动到xml文件中的新位置

时间:2012-04-19 06:58:03

标签: java xml xml-parsing

我想将特定的xml元素移动到列表的顶部。

xml输入:

<?xml version="1.0" encoding="UTF-8"?>
<Values>       
    <Elem Value="1"/>    
    <Elem Value="2"/>
    <Elem Value="3"/>
</Values>

期望的结果:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Values>       
    <Elem Value="2"/>
    <Elem Value="1"/>      
    <Elem Value="3"/>
</Values>

这是我的代码:

String valueToFind = "2";

File mFile = new File("C:\\xml.xml");
DocumentBuilder builder;
try {
    builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();

    Document document = builder.parse(mFile);

    NodeList nodeList = document.getElementsByTagName("Elem");
    Element element = null;

    for (int i = 0; i < nodeList.getLength(); i++) {
    element = (Element) nodeList.item(i);
    String value = element.getAttribute("Value");

    if (valueToFind.equals(value))
        break;
        else
       element = null;
    }

    if (element != null) {
    document.getDocumentElement().removeChild(element);
    document.getDocumentElement().insertBefore(element, nodeList.item(0));
    }

    Source source = new DOMSource(document);
    Result result = new StreamResult(mFile.getPath());

    Transformer transformer = TransformerFactory.newInstance().newTransformer();
    transformer.setOutputProperty(OutputKeys.INDENT, "yes");
    transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
    transformer.transform(source, result);
}

但结果不正确:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Values>       
    <Elem Value="2"/>
    <Elem Value="1"/>    

    <Elem Value="3"/>
</Values>

为什么我会空行?!

2 个答案:

答案 0 :(得分:0)

原始XML文件包含带空格的文本节点。您的代码仅删除Elem节点并将其插入列表顶部,但包含换行符的文本节点仍然存在。

答案 1 :(得分:0)

没有直接属性可以删除解析器中可用空格的空节点或文本节点。因为解析器能够使用/不使用这些节点来解析XML。但是如果你仍然想这样做,那么因为XML规范具有属性xml:space =“preserve”,但它对Java Example没有用。以下是删除这些节点的典型复杂方法。

Remove nodes and empty lines

Stackoverflow Example