什么';这个Java XML解析代码有什么问题?
我试图解析一个XML文件,并且能够插入一个路径并获取字段的值 情况如下:什么';这个Java XML解析代码有什么问题?,java,xml,parsing,Java,Xml,Parsing,我试图解析一个XML文件,并且能够插入一个路径并获取字段的值 情况如下: import java.io.IOException; import javax.xml.parsers.*; import org.w3c.dom.*; import org.xml.sax.SAXException; public class XMLConfigManager { private Element config = null; public XMLConfigManager(Strin
import java.io.IOException;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.SAXException;
public class XMLConfigManager {
private Element config = null;
public XMLConfigManager(String file) {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try {
Document domTree;
DocumentBuilder db = dbf.newDocumentBuilder();
domTree = db.parse(file);
config = domTree.getDocumentElement();
}
catch (IllegalArgumentException iae) {
iae.printStackTrace();
}
catch (ParserConfigurationException pce) {
pce.printStackTrace();
}
catch (SAXException se) {
se.printStackTrace();
}
catch (IOException ioe) {
ioe.printStackTrace();
}
}
public String getStringValue(String path) {
String[] pathArray = path.split("\\|");
Element tempElement = config;
NodeList tempNodeList = null;
for (int i = 0; i < pathArray.length; i++) {
if (i == 0) {
if (tempElement.getNodeName().equals(pathArray[0])) {
System.out.println("First element is correct, do nothing here (just in next step)");
}
else {
return "**This node does not exist**";
}
}
else {
tempNodeList = tempElement.getChildNodes();
tempElement = getChildElement(pathArray[i],tempNodeList);
}
}
return tempElement.getNodeValue();
}
private Element getChildElement(String identifier, NodeList nl) {
String tempNodeName = null;
for (int i = 0; i < nl.getLength(); i++) {
tempNodeName = nl.item(i).getNodeName();
if (tempNodeName.equals(identifier)) {
Element returner = (Element)nl.item(i).getChildNodes();
return returner;
}
}
return null;
}
}
在这里,我期望标签spam
的值,因此这将是“这是测试返回字符串
”。但是我得到了null
我几天来一直试图解决这个问题,但我就是搞不懂。迭代的工作原理是到达标记spam
,但是,正如我所说的,它返回null
,而不是文本
这是一个错误还是我做错了?为什么?(
非常感谢你的帮助
关于Flo,我想知道为什么您没有使用类似库的内置XPath。您正在使用非常低级的API(WC3 DOM)做大量工作
逐步使用调试器,看看
节点有哪些子节点。您应该很快找出它为什么为null。这比在这里询问要快。我想知道为什么您没有使用类似库的内置XPath。您正在使用非常低级的API(WC3 DOM)进行大量工作
逐步使用调试器,查看
节点有哪些子节点。您应该快速找出它为null的原因。这比在此处询问要快。您正在调用节点。getNodeValue()
-当您在元素上调用它时,它被记录为返回null。您应该调用getTextContent()
相反-当然,也可以使用更高级别的API。您正在调用节点.getNodeValue()
-当您在元素上调用它时,它被记录为返回null。您应该调用getTextContent()
相反-当然,也可以使用更高级别的API。因为您正在使用getNodeValue()
而不是getTextContent()
手动执行此操作是一个即将发生的意外;或者使用内置XPath解决方案,或者使用@duffymo建议的第三方库。我认为,这不是重新发明增加价值的情况。因为您使用的是
getNodeValue()
,而不是getTextContent()
手动执行此操作是一个即将发生的意外事件;要么使用内置XPath解决方案,要么使用@duffymo建议的第三方库。我认为,这不是一种再发明增加价值的情况。正如我前面提到的其他人所说,您似乎正在重新发明的概念。您可以用以下代码替换您的代码:
javax.xml.xpath.XPath xpath = javax.xml.xpath.XPathFactory.newInstance().newXPath();
String expression = "/amc/controller/general/spam";
org.xml.sax.InputSource inputSource = new org.xml.sax.InputSource("myConfig.xml");
String result = xpath.evaluate(expression, inputSource);
另见:
编辑:
使用XPath提取集合的示例:
NodeList result = (NodeList) xpath.evaluate(expression, inputSource, XPathConstants.NODESET);
for (int i = 0; i < result.getLength(); i++) {
System.out.println(result.item(i).getTextContent());
}
NodeList结果=(NodeList)xpath.evaluate(表达式、inputSource、XPathConstants.NODESET);
for(int i=0;i
javax.xml.xpath.xpath
接口是有文档记录的,本文中还有一些示例
此外,还有用于XML操作的第三方库,您可能会发现它们更方便,例如(建议的)或者。无论您使用哪个库,都可以利用非常强大的XPath语言。正如我前面提到的其他人一样,您似乎正在重新定义的概念。您可以用以下代码替换您的代码:
javax.xml.xpath.XPath xpath = javax.xml.xpath.XPathFactory.newInstance().newXPath();
String expression = "/amc/controller/general/spam";
org.xml.sax.InputSource inputSource = new org.xml.sax.InputSource("myConfig.xml");
String result = xpath.evaluate(expression, inputSource);
另见:
编辑:
使用XPath提取集合的示例:
NodeList result = (NodeList) xpath.evaluate(expression, inputSource, XPathConstants.NODESET);
for (int i = 0; i < result.getLength(); i++) {
System.out.println(result.item(i).getTextContent());
}
NodeList结果=(NodeList)xpath.evaluate(表达式、inputSource、XPathConstants.NODESET);
for(int i=0;i
javax.xml.xpath.xpath
接口是有文档记录的,本文中还有一些示例
此外,还有用于XML操作的第三方库,您可能会发现它们更方便,例如(建议的)或者。无论使用哪个库,都可以利用功能强大的XPath语言。您可能走得太远了。如果在循环中获得了该|分隔列表中所有元素的子元素,则最后返回的值将是“spam”的子元素,它不存在。Java自JavaSE 5以来就有一个XPath库。它可以在
javax.xml.XPath
包中找到。您可能走得太远了。如果在循环中您得到了该|分隔列表中所有元素的子元素,则最后返回的值将是“spam”的子元素,它不存在。Java自JavaSE 5以来就有一个XPath库。它可以在javax.xml.XPath
包中找到。如果复制了部分…
,并且第二个标记name和ifc中有其他值,我如何从中获取集合?(所有代理/例如所有代理/名称值)?nameAnameB@Florian我添加了一个提取集合的示例。如果零件…
被复制,并且第二个标记name和ifc中有其他值,我如何从中提取集合?(所有代理/例如所有代理/名称值)?nameAnameB@Florian我添加了一个提取集合的示例。