私はすべての「<Type>
"パラメーターtype_id =" 4218 "??要素
XMLドキュメント:
<BSQCUBS Version="0.04" Date="Fri Dec 9 11:43:29 GMT 2011" MachineDate="Fri, 09 Dec 2011 11:43:29 +0000">
<Class class_id="385">
<Title>Football Matches</Title>
<Type type_id="4264" type_minbet="0.1" type_maxbet="2000.0">
...
</Type>
<Type type_id="5873" type_minbet="0" type_maxbet="0">
...
</Type>
<Type type_id="4725" type_minbet="0.1" type_maxbet="2000.0">
...
</Type>
<Type type_id="4218" type_minbet="0.1" type_maxbet="2000.0">
...
</Type>
<Type type_id="4221" type_minbet="0.1" type_maxbet="2000.0">
...
</Type>
<Type type_id="4218" type_minbet="0.1" type_maxbet="2000.0">
...
</Type>
<Type type_id="4299" type_minbet="0.1" type_maxbet="2000.0">
...
</Type>
</Class>
</BSQCUBS>
ここに私のJavaコード:
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(new URL("http://cubs.bluesq.com/cubs/cubs.php?action=getpage&thepage=385.xml").openStream());
doc.getDocumentElement().normalize();
NodeList nodeList = doc.getElementsByTagName("Type");
System.out.println("ukupno:"+nodeList.getLength());
if (nodeList != null && nodeList.getLength() > 0) {
for (int j = 0; j < nodeList.getLength(); j++) {
Element el = (org.w3c.dom.Element) nodeList.item(j);
type_id = Integer.parseInt(el.getAttribute("type_id"));
System.out.println("type id:"+type_id);
}
}
このコードは私にすべての要素を与えます、私はそれを望んでいません、属性type_id = "4218"であるすべての要素が欲しいです!
XPathはあなたにとって正しい選択です。
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse("<Your xml doc uri>");
XPathFactory xPathfactory = XPathFactory.newInstance();
XPath xpath = xPathfactory.newXPath();
XPathExpression expr = xpath.compile("//Type[@type_id=\"4218\"]");
NodeList nl = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
そして、nl
を反復処理します
ループ内の条件が欠落しています:
if(nodeList != null && nodeList.getLength() > 0){
for (int j = 0; j < nodeList.getLength(); j++) {
Element el = (org.w3c.dom.Element) nodeList.item(j);
if (el.hasAttribute("type_id") && el.getAttribute("type_id").equals("4218")) {
type_id = Integer.parseInt(el.getAttribute("type_id"));
System.out.println("type id:"+type_id);
}
}
}
また、ループの前にifを削除できるように、getElementsByTagNameによって返されるNodeListがnullかどうかをテストする必要はありません。
一般的には、XPathを使用した方がよい場合があります。
XPathを使用できます。XPathは、XMLドキュメント内の要素と属性をナビゲートするために使用されます。Javaには、Xpathの優れた実装がいくつかあります。
あなたの例
XPath xpath = XPathFactory.newInstance().newXPath();
XPathExpression expr = xpath.compile("//Type[@type_id=\"4218\"]");
Object exprResult = expr.evaluate(doc, XPathConstants.NODESET);
NodeList nodeList = (NodeList) exprResult;
以下の@soulcheckの回答に従い、可能であればbreakステートメントを入力してください...検索を強化できます。
if(nodeList != null && nodeList.getLength() > 0){
for (int j = 0; j < nodeList.getLength(); j++) {
Element el = (org.w3c.dom.Element) nodeList.item(j);
if (el.hasAttribute("type_id") && el.getAttribute("type_id").equals("4218")) {
type_id = Integer.parseInt(el.getAttribute("type_id"));
System.out.println("type id:"+type_id);
break;
}
}
}
次のXPathにより、目的のType要素が得られます。
/BSQCUBS/Class/Type[@type_id=4218]
したがって、次のJavaコードを使用して、これらのみを含むNodeListを取得できます。
XPathExpression expr = xpath.compile("/BSQCUBS/Class/Type[@type_id=4218]");
NodeList nl = (NodeList)expr.evaluate(doc, XPathConstants.NODESET);