我一直在使用
java来学习一些新的技术来解析文件,而对于msot的部分,我一直在努力.不过,我对于如何解析xml文件到结构在收到时未知的地方,我感到失落.很多例子,如果你知道结构(getElementByTagName似乎是去的方式),但没有动态选项,至少不是我已经找到了这样做.
所以这个问题的tl; dr版本,我如何解析一个xml文件,我不能依靠知道它的结构?
解决方法
解析部分很简单;就像holderdarocha在评论中所说的那样,解析器只需要有效的
XML,它不关心结构.您可以使用
Java的标准
DocumentBuilder
获取
Document
:
InputStream in = new FileInputStream(...); Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(in);
(如果您正在解析多个文档,则可以继续重复使用相同的DocumentBuilder.)
Element root = doc.getDocumentElement(); // perform DOM operations starting here.
至于处理它,它真的取决于你想要做什么,但是你可以使用像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 = "<objects><circle color='red'/><circle color='green'/><rectangle>hello</rectangle><glumble/></objects>"; // 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文档(例如硬编码)是:
<objects> <circle color='red'/> <circle color='green'/> <rectangle>hello</rectangle> <glumble/> </objects>
输出为:
It's a red circle! It's a green circle! It's a rectangle that says "hello". I don't know what a glumble is for.