有一个简单的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;
}
试试这个。修改后,添加转换器以格式化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] 删除。
我来说两句