1

次のような XML があります。

<thoughts>
    <thought>
        <id>1</id>
        <category>Leadership</category>
        <what>sometext</what>            
        <who>sometext</who>
    </thought>
    <thought>
        <id>2</id>
        <category>Leadership</category>
        <what>sometext</what>            
        <who>sometext</who>
    </thought>
    ... 100's of with category Leadership
    <thought>
        <id>1</id>
        <category>Love</category>
        <what>sometext</what>            
        <who>sometext</who>
    </thought>
    <thought>
        <id>2</id>
        <category>Love</category>
        <what>sometext</what>            
        <who>sometext</who>
    </thought>
    ... 100's of with category Love

    ... and so on up to about ten categories
</thoughts>

特定のカテゴリと Android の ID について、この xml を Java で解析しています。これが私のコードです:

String id= "100",category="Love";// for example
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(getResources().openRawResource(R.raw.thoughts));
doc.getDocumentElement().normalize();

// Log.d(LOG,"root: " + doc.getDocumentElement().getNodeName());
NodeList nList = doc.getElementsByTagName("thought");

for (int temp = 0; temp < nList.getLength(); temp++) {
    org.w3c.dom.Node nNode = nList.item(temp);
    Element eElement = (Element) nNode;
    if (nNode.getNodeType() == Node.ELEMENT_NODE && getTagValue("id", eElement).contains(id) && getTagValue("category", eElement).contains(category)) {
        Log.d("THOUGHTSERVICE", "getTagValue(\"what\", eElement):"+getTagValue("what", eElement));
        what = getTagValue("what", eElement);
        who = getTagValue("who", eElement);
    }
}

問題は、これは一種のブルート フォースです。他の方法を提案できますか?例を挙げることができます。

前もって感謝します

4

4 に答える 4

1

JAXB を使用しない理由。詳細については、Java に最適なXML パーサーを参照してください。

于 2012-09-15T10:41:54.643 に答える
1

XPathベースのクエリは、関心のあるノードがわかっているため、この状況により適しているようです。

于 2012-09-15T10:43:02.487 に答える
0

より適切に使用するxmlPullParserと、順番に読み取り、興味のあるタグを見つけて読み取るとすぐに読み取りを停止できます。RAM の使用量が減少します。さらに、必要なタグがファイルの先頭にある場合は、読み取る必要はありません。ファイルの残りの部分。

<id>一致しない場合は次の<id>タグにスキップするなど、スキップすることもできます。

于 2012-09-15T10:41:25.610 に答える
0

// DOM パーサー プロシージャを使用して xml 応答文字列を解析する

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder db = factory.newDocumentBuilder();
Document doc = db.parse(inStream);
NodeList nodeList = doc.getElementsByTagName("thoughts");
for (int index = 0; index < nodeList.getLength(); index++)
{
    Node node = nodeList.item(index);
    if (node.getNodeType() == Node.ELEMENT_NODE)
    {
        Element element = (Element) node;
        NodeList PAYMENT_DATENode = element.getElementsByTagName("id");
        for (int iIndex = 0; iIndex < PAYMENT_DATENode.getLength(); iIndex++) 
        {
            if (PAYMENT_DATENode.item(iIndex).getNodeType() == Node.ELEMENT_NODE) 
            {
                Element nameElement = (Element) PAYMENT_DATENode.item(iIndex);
                String s = (nameElement.getFirstChild().getNodeValue();
            }
        }
    }
}
于 2012-09-15T11:21:28.180 に答える