当前位置: 首页 > 知识库问答 >
问题:

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

朱刚捷
2023-03-14

有一个简单的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的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中,我想这是问题所在。在写回它时,有什么方法可以重新格式化整个文件吗?这样可以避免空行。

尝试在谷歌上搜索,只得到缩进相关信息,这不是这里的问题。

提前感谢。

编辑:进行更新的代码:

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;
}

共有1个答案

袁鸿畅
2023-03-14

试试这个。修改后添加变压器来格式化您的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:示例。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类的输出:Modified 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);

样品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>
 类似资料:
  • 主要内容:Java DOM解析器 创建XML文档的示例Java DOM解析器 创建XML文档的示例 执行以上程序后,控制台输出结果为 在D盘根目录下生成了cars.xml文件,内容如下:  

  • 问题内容: 我想解析以下网址:http : //eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi? db= nucleotide& id= 224589801 结果,我想出了以下方法: 通过这种方法,我可以获取Item节点的值,但不能获取其任何属性。我尝试使用NamedNodeMap与getAttribute()进行实验,但仍然无济于事。 为什

  • 主要内容:Java DOM解析器 解析XML文档的步骤,Java DOM解析器 解析XML文档的示例Java DOM解析器 解析XML文档的步骤 以下是使用 DOM解析器 解析文档时使用的步骤。 导入与 XML 相关的包。 创建一个文档生成器。 从文件或流创建文档 提取根元素 检查属性 检查子元素 导入 XML 相关的包 创建一个文档生成器 从文件或流创建文档 提取根元素 检查属性 检查子元素 Java DOM解析器 解析XML文档的示例 项目结构如下: input.xml文件: DomPars

  • 问题内容: 我目前正在解析XML,但是我不太确定如何解析“消息”的“状态”属性: 这是代码,我切断了所有不必要的内容: 谁能指导我该如何完成? 提前致谢。 问题答案: Node.getAttributes() 如果使用XPATH检索数据,则可以避免遍历。阅读本教程。

  • 我尝试使用DocumentBuilderFactory解析XML文件,如下所示: 其中ndsFileInputStream是一个InputStream,包装包含XML的文件。 当文件包含Unicode字符(如Δ)时,会出现异常。当我去掉包含违规字符的行时,解析工作正常。 该文件包含特征

  • 问题内容: 我有下面的xml: Ι要解析此xml文件并从 ListofDocs 获取 主题ID 和 百分比 __ 第一种方法是从xml获取所有文档元素,然后检查祖父节点是否为ListofDocs。但是元素文档存在于 rankDocs 和 listOfDocs中 ,因此我有一个很大的列表。 所以我想知道是否存在更好的解决方案来解析此xml以避免if语句? 我的代码: 问题答案: 首先,在检查节点名称