获取给定节点名称的另一个节点的子节点
我有这样的XML:
1 Declaration of Human Rights lib 2 Fair trade lib 3 The wars for water lib
我有这个代码:
//XML parsing Document docsDoc = null; try { DocumentBuilder db = dbf.newDocumentBuilder(); docsDoc = db.parse(new InputSource(new StringReader(xmlWithDocs))); } catch(ParserConfigurationException e) {e.printStackTrace();} catch(SAXException e) {e.printStackTrace();} catch(IOException e) {e.printStackTrace();} //retrieve document elements NodeList docs = docsDoc.getElementsByTagName("document"); if (docs.getLength() > 0){ //print a row for each document for (int i=0; i<docs.getLength(); i++){ //get current document Node doc = docs.item(i); //print a cell for some document children for (int j=0; j<columns.length; j++){ Node cell; //print docname cell = doc.getElementsByTagName("docname").item(0); //doesn't work System.out.print(cell.getTextContent() + "\t"); //print aoo cell = doc.getElementsByTagName("aoo").item(0); //doesn't work System.out.print(cell.getTextContent() + "\t"); } System.out.println(); } }
但是,如你所知Node
没有getElementsByTagName
方法 ……只有Document
有它。 但我不能做docsDoc.getElementsByTagName("aoo")
,因为它会返回我所有的节点,而不仅仅是我正在检查的
节点中存在的节点。
我怎么能这样做? 谢谢!
如果Node
不仅仅是任何节点,而且实际上是一个Element
(它也可以是例如属性或文本节点),您可以将其getElementsByTagName
为Element
并使用getElementsByTagName
。
检查Node
是否为Dom Element
,强制转换并调用getElementsByTagName()
Node doc = docs.item(i); if(doc instanceof Element) { Element docElement = (Element)doc; ... cell = doc.getElementsByTagName("aoo").item(0); }
你应该递归地阅读它,前一段时间我有同样的问题并用这段代码解决:
public void proccessMenuNodeList(NodeList nl, JMenuBar menubar) { for (int i = 0; i < nl.getLength(); i++) { proccessMenuNode(nl.item(i), menubar); } } public void proccessMenuNode(Node n, Container parent) { if(!n.getNodeName().equals("menu")) return; Element element = (Element) n; String type = element.getAttribute("type"); String name = element.getAttribute("name"); if (type.equals("menu")) { NodeList nl = element.getChildNodes(); JMenu menu = new JMenu(name); for (int i = 0; i < nl.getLength(); i++) proccessMenuNode(nl.item(i), menu); parent.add(menu); } else if (type.equals("item")) { JMenuItem item = new JMenuItem(name); parent.add(item); } }
可能你可以根据你的情况调整它。
//xn=list of parent nodes...... foreach (XmlNode xn in xnList) { foreach (XmlNode child in xn.ChildNodes) { if (child.Name.Equals("name")) { name = child.InnerText; } if (child.Name.Equals("age")) { age = child.InnerText; } } }