在不知道xml文件结构的情况下解析xml文件内容

我一直在努力学习一些使用java来解析文件的新技术,而对于msot部分,它一切顺利。 但是,我很遗憾如何将xml文件解析为收到结构时未知的结构。 如果您知道结构(getElementByTagName似乎是要走的路),那么如何做的大量示例,但没有动态选项,至少不是我发现的。

所以这个问题的tl; dr版本,如何解析xml文件,我不能依赖它知道它的结构?

解析部分很容易; 像注释中所述的helderdarocha,解析器只需要有效的XML,它不关心结构。 您可以使用Java的标准DocumentBuilder来获取Document

 InputStream in = new FileInputStream(...); Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(in); 

(如果要解析多个文档,可以继续重用相同的DocumentBuilder 。)

然后你可以从根文档元素开始,并从那里使用熟悉的DOM方法:

 Element root = doc.getDocumentElement(); // perform DOM operations starting here. 

至于处理它,它真的取决于你想用它做什么,但你可以使用Node的方法,如getFirstChild()getNextSibling()迭代子进程并根据结构,标签,你认为合适的进程,和属性。

请考虑以下示例:

 import java.io.ByteArrayInputStream; import java.io.InputStream; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; public class XML { public static void main (String[] args) throws Exception { String xml = "hello"; // parse InputStream in = new ByteArrayInputStream(xml.getBytes("utf-8")); Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(in); // process Node objects = doc.getDocumentElement(); for (Node object = objects.getFirstChild(); object != null; object = object.getNextSibling()) { if (object instanceof Element) { Element e = (Element)object; if (e.getTagName().equalsIgnoreCase("circle")) { String color = e.getAttribute("color"); System.out.println("It's a " + color + " circle!"); } else if (e.getTagName().equalsIgnoreCase("rectangle")) { String text = e.getTextContent(); System.out.println("It's a rectangle that says \"" + text + "\"."); } else { System.out.println("I don't know what a " + e.getTagName() + " is for."); } } } } } 

输入XML文档(例如硬编码)是:

    hello   

输出是:

这是一个红圈!
这是一个绿色的圈子!
这是一个说“你好”的矩形。
我不知道什么是咕噜咕噜。