[英]Parsing XML with tags with same name on different levels in DOM
I've been at this for days and cannot find a way to parse this XML file. 我已经待了好几天了,找不到解析此XML文件的方法。 I've tried XMLPullParser, SAX and now DOM, but as soon as I'd made some progress, I realized that I have two different <con>
tags. 我已经尝试过XMLPullParser,SAX和现在的DOM,但是一旦取得了一些进展,我就意识到我有两个不同的<con>
标记。 I'm new to Java and Android, and especially new to XML parsing, so any help would mean a lot. 我是Java和Android的新手,尤其是XML解析的新手,所以任何帮助都将非常重要。
Here's a segment of the xml file: 这是xml文件的一部分:
<data>
<con id="f3cVQQjz8jr">
<con idref="nJ4haotQTo0"/>
<added order="9">2013-08-22T03:14:13.439Z</added>
<name>Alex</name>
<rank>0</rank>
</con>
<con id="nJ4haotQTo0">
<added order="10">2013-08-22T03:14:13.439Z</added>
<name>Charley</name>
<rank>-2</rank>
</con>
<con id="jadh7bH25mI">
<added order="11">2013-08-22T03:14:13.439Z</added>
<name>David</name>
<rank>1227133510</rank>
</con>
<con id="erfhZ_dn0HA">
<con idref="nJ4haotQTo0"/>
<added order="12">2013-08-22T03:14:13.439Z</added>
<name>Sebastien</name>
<rank>1073741824</rank>
</con>
</data>
As you can see, not all sections have a child <con>
tag, so I don't think using a counter would work. 如您所见,并非所有部分都具有子<con>
标记,因此我认为使用计数器不起作用。
Here's my latest attempt (doesn't do anything about the nested <con>
tags): 这是我最近的尝试(对嵌套的<con>
标签不做任何事情):
public void parseContext()
{
NodeList nodeList = doc.getElementsByTagName("con");
int size = nodeList.getLength();
for(int i = 0 ; i < size ; i++)
{
System.out.println("---------------Context ("+i+")--------------------");
Node node = nodeList.item(i);
if(node.getNodeType() == Node.ELEMENT_NODE)
{
Element e = (Element) node;
NodeList resultNodeList = e.getElementsByTagName("name");
int resultNodeListSize = resultNodeList.getLength();
for(int j = 0 ; j < resultNodeListSize ; j++ )
{
Node resultNode = resultNodeList.item(j);
if(resultNode.getNodeType() == Node.ELEMENT_NODE)
{
Element resultE = (Element) resultNode;
System.out.println("Context Name :"+resultE.getTextContent());
}
}
}
}
}
Which results in: 结果是:
---------------Context (0)--------------------
Context Name :Alex
---------------Context (1)--------------------
Context Name :Charley
---------------Context (2)--------------------
---------------Context (3)--------------------
Context Name :David
---------------Context (4)--------------------
Context Name :Sebastien
---------------Context (5)--------------------
...
What I'd like to have is something like this: 我想要的是这样的:
---------------Context (0)--------------------
Context Name :Alex
Context ID Ref: duRjfksjf0
---------------Context (1)--------------------
Context Name :Charley
Context ID Ref: null
---------------Context (3)--------------------
Context Name :David
Context ID Ref: null
---------------Context (4)--------------------
Context Name :Sebastien
Context ID Ref: iJ4hasftQTo0
---------------Context (5)--------------------
....
Again, the document is much longer, and there is no pattern between whether or not there is an idref
. 同样,文档更长,并且在是否存在idref
之间没有模式。 I will eventually be parsing all the data within the parent <con>
tags, but I would be able to figure that out if I knew how to deal with the child <con>
tag. 我最终将解析父<con>
标记内的所有数据,但是如果我知道如何处理子<con>
标记,我将能够弄清楚。
I searched and found this: How to differentiate parent and child tag while dom parsing? 我搜索后发现: dom解析时如何区分父标签和子标签? though there were no helpful answers. 尽管没有有用的答案。 No questions I found involved tags with same names on different levels. 我没有发现任何问题涉及不同级别具有相同名称的标签。 I know there're a lot of similar questions, and will understand if this gets deleted. 我知道有很多类似的问题,并且会理解是否将其删除。 Though again, I'd really appreciate the help. 虽然再次,我将非常感谢您的帮助。
Node node = nodeList.item(i);
NodeList list = node.getChildNodes();
for (int i = 0; i < list.getLength(); i++) {
Node childnode = list.item(i);
if ("con".equals(childnode.getNodeName())) {
//it have a second con tag
}
}
take a look of this: http://www.mkyong.com/java/how-to-modify-xml-file-in-java-dom-parser/ 看看这个: http : //www.mkyong.com/java/how-to-modify-xml-file-in-java-dom-parser/
This is similar to what I have just done for my project. 这类似于我刚刚为项目完成的工作。 I prefer to write some common methods in order to reuse it in other places. 我更喜欢编写一些通用方法以便在其他地方重用它。
package com.practice;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
public class XMLHelper {
public static void main(String[] args) {
parseContext();
}
public static Document createDocumentFromFile() {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
Document document = null;
try {
dbf.setValidating(false);
DocumentBuilder db = dbf.newDocumentBuilder();
document = db.parse("xmltest.txt");
} catch (Exception e) {
e.printStackTrace();
}
return document;
}
public static Element converDocumentToElement(Document document) {
Element rootElement = null;
if (document != null) {
document.getDocumentElement().normalize();
rootElement = document.getDocumentElement();
}
return rootElement;
}
public static List<Element> getElementsByName(Element elem, String name) {
List<Element> elements = null;
if (elem == null) return elements;
NodeList nodeList = elem.getElementsByTagName(name);
if (nodeList == null || nodeList.getLength() == 0) return elements;
elements = new ArrayList<Element>();
for (int i=0; i<nodeList.getLength(); i++) {
Element element = (Element) nodeList.item(i);
elements.add(element);
}
return elements;
}
public static void parseContext() {
Document document = createDocumentFromFile();
Element rootElement = converDocumentToElement(document);
List<Element> outsideConElements = getElementsByName(rootElement, "con");
if (outsideConElements == null) {
System.out.println("no <con> is found!");
} else {
for (Element outsideConElement : outsideConElements) {
List<Element> insideConElements = getElementsByName(outsideConElement, "con");
if (insideConElements != null && !insideConElements.isEmpty()) {
Element insideConElement = insideConElements.get(0);
if (insideConElement != null)
System.out.println(insideConElement.getAttribute("idref"));
}
}
}
}
}
Try this ... 尝试这个 ...
if(node.getNodeType() == Node.ELEMENT_NODE){
Element e = (Element) node;
NodeList resultNodeList = e.getElementsByTagName("con");
if(!e.hasAttribute("idref")){
if(resultNodeList.getLength() == 2){
Element nameElement = (Element) resultNodeList.item(1);
if(!nameElement.hasAttribute("idref"))
System.out.println("Context ID Ref : "+null);
else
System.out.println("Context ID Ref :"+nameElement.getAttribute("idref"));
}else {
Element nameElement = (Element) resultNodeList.item(0);
if(!nameElement.hasAttribute("idref"))
System.out.println("Context ID Ref : "+null);
else
System.out.println("Context ID Ref :"+nameElement.getAttribute("idref"));
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.