有一个简单的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;
}
试试这个。修改后添加变压器来格式化您的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语句? 我的代码: 问题答案: 首先,在检查节点名称