次のようなXMLがあります。
_<documentslist>
<document>
<docnumber>1</docnumber>
<docname>Declaration of Human Rights</docname>
<aoo>lib</aoo>
</document>
<document>
<docnumber>2</docnumber>
<docname>Fair trade</docname>
<aoo>lib</aoo>
</document>
<document>
<docnumber>3</docnumber>
<docname>The wars for water</docname>
<aoo>lib</aoo>
</document>
<!-- etc. -->
</documentslist>
_
私はこのコードを持っています:
_//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
のみにあります。しかし、検査している_<aoo>
_ノードに存在するものだけでなく、すべての_<document>
_ノードを返すため、docsDoc.getElementsByTagName("aoo")
を実行できません。
どうすればいいですか?ありがとう!
Node
が単なるノードではなく、実際にはElement
(たとえば、属性またはテキストノード)である場合、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;
}
}
}