gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:43:10 24 4
gpt4 key购买 nike

有一个简单的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 属性中设置相同的 ID。

我正在使用一个简单的 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;
}

最佳答案

试试这个。添加转换器以在修改后格式化您的 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);

样本.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 文件时创建的新行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24402110/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com