遍历DOM树以获取(名称,值)属性对和叶节点对
我想遍历DOM中的XML文件,以便检索所有的(名称,值)对:
- 属性名称和值;
- 所有叶节点名称及其文本内容;
因此,以下面的XML文件为例:
abcd efgh ijkl mnop qrst
我想要的名称值对是:
text=title1 id=comment1 data=abcd data=efgh id=commment2 data=ijkl data=mnop data=qrst
更简单的解决方案可能是使用XPath提取所有名称值对,如以下示例所示。 您还可以跳过DOM构造并直接在InputSource
上调用evaluate。 XPath表达式
//@* | //*[not(*)]
匹配所有属性的联合以及没有任何子节点的所有节点。
import java.io.StringReader; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathFactory; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; public class Test { private static final String xml = "\n" + " \n" + " abcd \n" + " efgh \n" + " \n" + " \n" + " ijkl \n" + " mnop \n" + " qrst \n" + " \n" + " \n"; public static void main(String[] args) throws Exception { DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); Document doc = builder.parse(new InputSource(new StringReader(xml))); XPathFactory xpf = XPathFactory.newInstance(); XPath xp = xpf.newXPath(); NodeList nodes = (NodeList)xp.evaluate("//@* | //*[not(*)]", doc, XPathConstants.NODESET); System.out.println(nodes.getLength()); for (int i=0, len=nodes.getLength(); i
怎么样的:
String xml = "\n" + "\n" + " \n" + " abcd \n" + " efgh \n" + " \n" + " \n" + " ijkl \n" + " mnop \n" + " qrst \n" + " \n" + " \n"; try { DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); Document doc = builder.parse(new InputSource(new StringReader(xml))); DocumentTraversal traversal = (DocumentTraversal) doc; NodeIterator iterator = traversal.createNodeIterator( doc.getDocumentElement(), NodeFilter.SHOW_ELEMENT, null, true); for (Node n = iterator.nextNode(); n != null; n = iterator.nextNode()) { //System.out.println("Element: " + ((Element) n).getTagName()); String tagname = ((Element) n).getTagName(); if(tagname.equals("title")) { System.out.println("text=" + ((Element)n).getAttribute("text")); } else if(tagname.equals("comment")) { System.out.println("id=" + ((Element)n).getAttribute("id")); } else if(tagname.equals("data")) { System.out.println("data=" + ((Element)n).getTextContent()); } else { System.out.println("Unhandled element"); } } } catch (Exception e) { e.printStackTrace(); }
好的,所以你对此不满意,怎么样:
String xml = "\n" + "\n" + " \n" + " abcd \n" + " efgh \n" + " \n" + " \n" + " ijkl \n" + " mnop \n" + " qrst \n" + " \n" + " \n"; try { DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); Document doc = builder.parse(new InputSource(new StringReader(xml))); DocumentTraversal traversal = (DocumentTraversal) doc; NodeIterator iterator = traversal.createNodeIterator( doc.getDocumentElement(), NodeFilter.SHOW_ELEMENT, null, true); for (Node n = iterator.nextNode(); n != null; n = iterator.nextNode()) { //System.out.println("Element: " + ((Element) n).getTagName()); String tagname = ((Element) n).getTagName(); NamedNodeMap map = ((Element)n).getAttributes(); if(map.getLength() > 0) { for(int i=0; i