使用DOM解析器更新xml文件时创建的新行

艾伦·弗朗西斯(Alan Francis)

有一个简单的xml,格式如下

<configuration>
<property>
  <name>crawling.depth</name>
  <value>1</value>
  <description/>
</property>

<property>
  <name>video.appid</name>
  <value>2</value>
  <description>Value modified @25-06-2014 11:37:28.731</description>
</property>
</configuration>

在启动应用程序时,我会生成一个ID,并在XML的video.appid属性中进行设置。

我正在使用一个简单的DOM解析器,并且XML已正确更新,但是在重复启动过程中,注意到两个属性之间的空间正在添加。经过五次左右的修改,该文件看起来像下面的文件。

<configuration>
 <property>
  <name>crawling.depth</name>
  <value>1</value>
  <description/>
</property>







<property>
  <name>video.appid</name>
  <value>2</value>
  <description>Value modified @25-06-2014 12:30:18.125</description>
</property>
</configuration>

我删除了该属性,然后将其重新添加到XML中,我想这是问题所在。在将其写回时,是否可以重新格式化整个文件?这样可以避免出现空行。

尝试使用Google搜索,但只缩进了相关信息,这不是这里的问题。

提前致谢。

编辑:执行更新的代码:

public static boolean updatePropInFile(File file, Map propMap){
    boolean success = false;
    try {
        DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
        Document doc = docBuilder.parse(file);
        NodeList props = doc.getElementsByTagName("property");//No I18N
        List<Element> elements = new ArrayList<Element>();

        for(int i=0;i<props.getLength();i++){
            Element prop = (Element)props.item(i);
            Element nme = (Element)prop.getElementsByTagName("name").item(0);//No I18N
            String propName = nme.getTextContent();
            Iterator it = propMap.entrySet().iterator();
            while (it.hasNext()) {
                Map.Entry pairs = (Map.Entry)it.next();
                if(pairs.getKey().equals(propName)){
                    prop.getParentNode().removeChild(prop);                     
                    i--;
                }
            }
        }
        Iterator it = propMap.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry pairs = (Map.Entry)it.next();
            elements.add(createPropertyElement(doc,String.valueOf(pairs.getKey()),String.valueOf(pairs.getValue())));
        }

        Node root = doc.getElementsByTagName("configuration").item(0);//No I18N
        for(Element ele:elements){
            root.appendChild(ele);
        }

        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");//No I18N
        transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");//No I18N
        DOMSource source = new DOMSource(doc);
        StreamResult result = new StreamResult(file);
        transformer.transform(source, result);
        success=true;
    } catch (Exception pce) {
        success=false;
    }

    return success;
}
AJJ

试试这个。修改后,添加转换器以格式化xml。

public class ParseXml {

    public static void main(String[] args) {
        System.out.println("Started XML modification");
        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory
                    .newInstance();
            DocumentBuilder docBuilder = factory.newDocumentBuilder();

            Document xmlDoc;

            xmlDoc = docBuilder.parse(new File("sample.xml"));

            NodeList nodes = xmlDoc.getElementsByTagName("fr");

            for (int i = 0, length = nodes.getLength(); i < length; i ++) {
                ((Element)nodes.item(i)).setTextContent("Modified");
            }

            xmlDoc.getDocumentElement().normalize();
            TransformerFactory transformerFactory = TransformerFactory
                    .newInstance();
            Transformer transformer = transformerFactory.newTransformer();
            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
            transformer.setOutputProperty(
                    "{http://xml.apache.org/xslt}indent-amount", "4");
            DOMSource domSource = new DOMSource(xmlDoc);
            StreamResult result = new StreamResult(new File("sample.xml"));
            transformer.transform(domSource, result);
            System.out.println("Modification Done");
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

实际的xml:Sample.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<titles>
    <tome>
       <de>DE1</de>
       <fr>Actual value</fr>
       <en>EN1</en>
    </tome>
    <valhalla>
       <de>DE2</de>
       <fr>Actual value</fr>
       <en>EN2</en>
    </valhalla>
    <vikings>
       <de>DE3</de>
       <fr>Actual value</fr>
       <en>EN3</en>
    </vikings>
</titles>

Java类的输出:修改的Xml:Sample.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<titles>
    <tome>
       <de>DE1</de>
       <fr>Modified</fr>
       <en>EN1</en>
    </tome>
    <valhalla>
       <de>DE2</de>
       <fr>Modified</fr>
       <en>EN2</en>
    </valhalla>
    <vikings>
       <de>DE3</de>
       <fr>Modified</fr>
       <en>EN3</en>
    </vikings>
</titles>

更新:

不知道为什么在格式化的xml中出现空白。需要知道您的createPropertyElement()的功能。目前,您可以使用xsl删除父标记之间的空白,

TransformerFactory transformerFactory = TransformerFactory
                    .newInstance();
Transformer transformer = transformerFactory.newTransformer(new StreamSource("sample.xsl"));
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(
                    "{http://xml.apache.org/xslt}indent-amount", "4");
DOMSource domSource = new DOMSource(xmlDoc);
StreamResult result = new StreamResult(new File("sample.xml"));
transformer.transform(domSource, result);

sample.xsl

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="xml" omit-xml-declaration="yes" />

    <xsl:strip-space elements="*" />

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" />
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Java中使用DOM解析器解析XML文件时查找具有子节点的节点

QT:读取xml文件并使用DOM解析器对其进行解析

用于 XML 编辑、更新的 DOM 解析器

使用Java中的dom解析器将xml文件转换为json对象

使用简单的HTML dom解析器创建多维数组?

使用DOM解析器读取XML注释

使用xpath和DOM解析器读取xml

使用xml dom解析器获取元素

使用SAX解析器解析包含umlaute的XML文件

如何使用Java中的DOM解析器在XML文件中声明doctype,xml版本和编码?

XML DOM解析器在Java?

使用Java解析器从xml获取属性时出错

大型文件的Java XML解析器

如何在不使用Java的DOM或SAX解析器的情况下解析XML?

使用DOM解析器Java解析具有嵌套重复元素名称的xml文档。

是否可以在Android中使用DOM解析器解析特定的XML?

Mule ESB:当xml元素中带有尖括号时,DOM到XML解析器会引发xml解析器错误

与使用DOM解析器手动解析XML文件相比,使用XSLT样式表有什么优势吗?

在SAX解析器中解析大型XML文件时没有内存的异常

尝试在 Perl 中解析 XML 3.5 文件时出现解析器错误

文件解析器-如何读取行

在此使用哪个XML解析器?

使用XSD,目录解析器和XXP的JAXP DOM验证XML

使用xpath和Java DOM解析器返回junit结果xml中的所有属性

使用PHP中的DOM解析器获取xml文档的标签和内容

传递从嵌入式资源文件创建的ifstream来增强XML解析器

在使用geotools解析器解析xml时如何获取null

使用Linux Shell的解析器文件

在使用PHP简单HTML DOM解析器进行选择时需要帮助