2

だから私はここでいくつかのxml解析を学ぼうとしていて、そのコツをつかんでいますが、何らかの理由で、各クエリの最後に「text()」を追加する必要があるようです。そうしないとnullになります値が返されました。この「text()」の終わりの機能は実際にはわかりませんが、必要ないことはわかっているので、なぜ省略できないのか疑問に思います。助けてください!これが私のコードです:

import org.w3c.dom.*;
import javax.xml.xpath.*;
import javax.xml.parsers.*;
import java.io.IOException;
import org.xml.sax.SAXException;

public class ParseClass 
{
public static void main(String[] args)
throws ParserConfigurationException, SAXException,
IOException, XPathExpressionException 
{
    DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
    domFactory.setNamespaceAware(true);
    DocumentBuilder builder = domFactory.newDocumentBuilder();
    Document doc = builder.parse("C:\\Users\\Brandon\\Job\\XPath\\XPath_Sample_Stuff\\catalog.xml");
    XPath xpath = XPathFactory.newInstance().newXPath();
    XPathExpression expr = xpath.compile("/catalog/book[author='Thurman, Paula']/title/text()");
    Object result = expr.evaluate(doc, XPathConstants.NODESET);
    NodeList nodes = (NodeList) result;
    for (int i = 0; i < nodes.getLength(); i++) 
    {
        System.out.println(nodes.item(i).getNodeValue());
    }
  }
}

PS。気づかなかった場合に備えて。解析にXPathとDOMを使用しています。

4

3 に答える 3

5

getNodeValue結果を呼び出しています。このドキュメントが示すように (表を参照) null、 type のノードに対するものElementです。を使用するtext()と、返されるセットに type のノードが含まれるTextようになるため、必要な結果が得られます (つまり、要素自体ではなく、タイトル要素のコンテンツ)。

また、xpathでの使用方法の詳細については、これを参照することをお勧めします。text()

また、要素からテキストを直接抽出したい場合は、getTextContent代わりにgetNodeValue次を使用できます。

// Will work for both element and text nodes
System.out.println(nodes.item(i).getTextContent());
于 2012-07-03T04:47:50.063 に答える
1

提案: DOM を使用しないでください。Java の世界 (JDOM、XOM、DOM4J) では、DOM よりもはるかに使いやすい XML のツリー表現が多数あります。DOM は、要素の getNodeValue() が null を返す、先ほど遭遇したような落とし穴でいっぱいです。誰もが DOM を使用する唯一の理由は、(a) もともとは W3C から来たものであり、(b) JDK に取り入れられたということです。しかし、それはすべて非常に昔のことであり、人々はその設計ミスから学んできました。

于 2012-07-03T07:30:47.157 に答える
1

まず、Xpath 式が無効です (タイプミスと考えています)。属性は で示されて@いるため、正しい xpath は になります/catalog/book[@author='Thurman, Paula']/title/text()

/catalog/book[@author='Thurman, Paula']/title/<title>xmlのノードと一致しますが、タイトル ノードが後の式のようなものである場合、つまり/catalog/book[@author='Thurman, Paula']/title/text()のテキスト ノードと一致します。<title><title>The Godfather</title>The Godfather

于 2012-07-03T04:46:19.207 に答える