我使用XPath从xml获取节点的名称和值,但我正在尝试的代码没有得到我的节点名称... 这是我正在解析的xml
<?xml version="1.0" encoding="UTF-8"?>
<reg>
<user>
<Name>adil</Name>
<Email>adil@gmail.com</Email>
<Picture>/storage/sdcard0/DCIM/browser-photos/1352975129941.jpg</Picture>
<LastEdited>26 Mar 2014 11:49:39</LastEdited>
</user>
<user>
<Name>zeeshan</Name>
<Email>zajmal@gmail.con</Email>
<Picture>/storage/sdcard0/DCIM/browser-photos/1352975129941.jpg</Picture>
<LastEdited>26 Mar 2014 11:49:39</LastEdited>
</user>
</reg>
这是我正在尝试的代码
XPath xPath = XPathFactory.newInstance().newXPath();
String expression = "//Email[text()='"adil@gmail.com"']";
System.out.println(expression);
Node node = (Node) xPath.compile(expression).evaluate(xmlDocument, XPathConstants.NODE);
if(null != node) {
Node pNode = node.getParentNode();
nodeList = pNode.getChildNodes();
for (int i = 0;null!=nodeList && i < nodeList.getLength(); i++) {
Node nod = nodeList.item(i);
if(nod.getNodeType() == Node.ELEMENT_NODE)
{
System.out.println(nod.getFirstChild().getNodeName().toString() + " : " + nod.getFirstChild().getNodeValue());
}
system.out.println()
的输出是
#text : adil
#text : adil@gmail.com
#text : /storage/emulated/0/DCIM/browser-photos/1352975129941.jpg
#text : 26 Mar 2014 11:49:39
我无法选择我错的地方......
答案 0 :(得分:0)
尝试此功能
public List<List<String>> Parseyourxmls(String xml) {
List<List<String>> ll = new ArrayList<List<String>>();
try {
DocumentBuilderFactory dbFactory = DocumentBuilderFactory
.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
InputStream is = new ByteArrayInputStream(xml.getBytes("UTF-8"));
Document doc = dBuilder.parse(is);
doc.getDocumentElement().normalize();
NodeList nList = doc.getElementsByTagName("OrderDetails");
if (nList.getLength() > 0) {
Node nNode = nList.item(0);
for (int i = 0; i < nList.getLength(); i++) {
nNode = nList.item(i);
System.out.println("\nCurrent Element :"
+ nNode.getNodeName());
if (nNode.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) nNode;
List<String> l = new ArrayList<String>();
l.add(0, eElement.getElementsByTagName("Name")
.item(0).getTextContent());
l.add(1, eElement.getElementsByTagName("Email")
.item(0).getTextContent());
/*all other */
ll.add(l);
}
}
return ll;
}
} catch (Exception e) {
Log.e("11111", e.toString());
}
return ll;
}
答案 1 :(得分:0)
您正在使用
遍历节点列表for (int i = 0; null != nodeList && i < nodeList.getLength(); i++) {
Node nod = nodeList.item(i);
// ...
}
每次通过nodeList.item(i)
调用获取用户节点的当前子节点时,首先是名称节点,然后是电子邮件节点,依此类推。但是你打印出来了
System.out.println(nod.getFirstChild().getNodeName().toString() + ...)
在这里,您正在检索当前节点的第一个子节点。名称节点的第一个子节点是包含内容的文本节点。所有其他节点也是如此。文本节点没有可识别的名称。 &#34; #text&#34;输出只是告诉你,这是一个文本节点。
你想要的是打印出节点的名称。像那样:
System.out.println(nod.getNodeName().toString() + ...)