JAVA中的DOM解析器查询

JAVA中的DOM解析器查询,java,xml,dom,xpath,Java,Xml,Dom,Xpath,提前感谢您的帮助…如下所示修复您的XPath表达式: /testCodeIdentifier/subjectOf/annotation[code/@code='SPECIALNOTE']/text 例如,您可以使用 Node.getTextContent(); 更新:在我发布上述XPath时,它似乎是正确的。同时,您已经完全更改了XML代码,现在XPath将读取 /testCodeIdentifier/subjectOf/code/subjectOf/annotation[code/@cod

提前感谢您的帮助…

如下所示修复您的XPath表达式:

/testCodeIdentifier/subjectOf/annotation[code/@code='SPECIALNOTE']/text
例如,您可以使用

Node.getTextContent();
更新:在我发布上述XPath时,它似乎是正确的。同时,您已经完全更改了XML代码,现在XPath将读取

/testCodeIdentifier/subjectOf/code/subjectOf/annotation[code/@code='SPECIALNOTE']/text
或者,因为我猜这个问题是如此的混乱,它仍然是错误的,只要做:

//注释[code/@code='SPECIALNOTE']/text

像这样修复XPath表达式:

/testCodeIdentifier/subjectOf/annotation[code/@code='SPECIALNOTE']/text
例如,您可以使用

Node.getTextContent();
更新:在我发布上述XPath时,它似乎是正确的。同时,您已经完全更改了XML代码,现在XPath将读取

/testCodeIdentifier/subjectOf/code/subjectOf/annotation[code/@code='SPECIALNOTE']/text
或者,因为我猜这个问题是如此的混乱,它仍然是错误的,只要做:

//注释[code/@code='SPECIALNOTE']/text

首先,您的XPath表达式有一个错误<代码>主题f被不必要地重复:

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("xml.xml");     
    XPath xpath = XPathFactory.newInstance().newXPath();        // XPath Query for showing all nodes value     

    XPathExpression expr = xpath.compile("/testCodeIdentifier/subjectOf/subjectOf/annotation/code[@code='SPECIALNOTE']");      
    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()+"........");      
        }   
    } 
}
现在,假设您确实需要对target
text
元素前面的
code
节点的引用,那么使用以下方法:

/subjectOf/subjectOf
其中
getNextElementSibling
定义如下:

XPathExpression expr = xpath.compile(
    "/testCodeIdentifier/subjectOf/annotation/code[@code='SPECIALNOTE']");
Node node = (Node) expr.evaluate(doc, XPathConstants.NODE);
System.out.println(getNextElementSibling(node).getTextContent());
关于这一点,有几点需要注意:

  • getNextSibling
    最初不适用于您的原因(很可能)是因为引用的
    code
    元素的下一个同级是文本节点,而不是元素节点。(
    code
    text
    之间的空格很重要。)这就是为什么我们需要
    getNextElementSibling
  • 我们选择的是单个节点,因此如果
    XPathConstants.NODELIST
请注意,您可能应该按照@Lukas的建议进行操作,并修改XPath表达式以直接选择目标文本

下面是如何直接获取文本(作为字符串):

以下是如何首先获取对元素的引用,然后检索其CDATA部分的内容:

XPathExpression expr = xpath.compile(
    "/testCodeIdentifier/subjectOf/annotation[code/@code='SPECIALNOTE']/text/text()");
String text = (String) expr.evaluate(doc, XPathConstants.STRING);
System.out.println(text);

首先,XPath表达式有一个错误<代码>主题f被不必要地重复:

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("xml.xml");     
    XPath xpath = XPathFactory.newInstance().newXPath();        // XPath Query for showing all nodes value     

    XPathExpression expr = xpath.compile("/testCodeIdentifier/subjectOf/subjectOf/annotation/code[@code='SPECIALNOTE']");      
    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()+"........");      
        }   
    } 
}
现在,假设您确实需要对target
text
元素前面的
code
节点的引用,那么使用以下方法:

/subjectOf/subjectOf
其中
getNextElementSibling
定义如下:

XPathExpression expr = xpath.compile(
    "/testCodeIdentifier/subjectOf/annotation/code[@code='SPECIALNOTE']");
Node node = (Node) expr.evaluate(doc, XPathConstants.NODE);
System.out.println(getNextElementSibling(node).getTextContent());
关于这一点,有几点需要注意:

  • getNextSibling
    最初不适用于您的原因(很可能)是因为引用的
    code
    元素的下一个同级是文本节点,而不是元素节点。(
    code
    text
    之间的空格很重要。)这就是为什么我们需要
    getNextElementSibling
  • 我们选择的是单个节点,因此如果
    XPathConstants.NODELIST
请注意,您可能应该按照@Lukas的建议进行操作,并修改XPath表达式以直接选择目标文本

下面是如何直接获取文本(作为字符串):

以下是如何首先获取对元素的引用,然后检索其CDATA部分的内容:

XPathExpression expr = xpath.compile(
    "/testCodeIdentifier/subjectOf/annotation[code/@code='SPECIALNOTE']/text/text()");
String text = (String) expr.evaluate(doc, XPathConstants.STRING);
System.out.println(text);

终于我自己找到了问题的答案。。。。下面的代码正在用于解析我的XML

XPathExpression expr = xpath.compile(
    "/testCodeIdentifier/subjectOf/annotation[code/@code='SPECIALNOTE']/text");
Node text = (Node) expr.evaluate(doc, XPathConstants.NODE);
System.out.println(text.getTextContent());
XPath=XPathFactory.newInstance().newXPath();
//用于显示所有节点值的XPath查询
XPathExpression expr=xpath.compile(“//testCodeIdentifier/subjectOf/order/subjectOf/annotation/code[@code='SPECIALNOTE']]/以下同级::text/text()”;
Object result=expr.evaluate(doc,XPathConstants.NODESET);
节点列表节点=(节点列表)结果;
对于(int i=0;i

谢谢大家在这篇文章中回答,但这是一个可能的解决方案。在上面打个记号。

我终于自己找到了问题的答案。。。。下面的代码正在用于解析我的XML

XPathExpression expr = xpath.compile(
    "/testCodeIdentifier/subjectOf/annotation[code/@code='SPECIALNOTE']/text");
Node text = (Node) expr.evaluate(doc, XPathConstants.NODE);
System.out.println(text.getTextContent());
XPath=XPathFactory.newInstance().newXPath();
//用于显示所有节点值的XPath查询
XPathExpression expr=xpath.compile(“//testCodeIdentifier/subjectOf/order/subjectOf/annotation/code[@code='SPECIALNOTE']]/以下同级::text/text()”;
Object result=expr.evaluate(doc,XPathConstants.NODESET);
节点列表节点=(节点列表)结果;
对于(int i=0;i

谢谢大家在这篇文章中回答,但这是一个可能的解决方案。请记住。

@GOK:对不起,我误解了你的问题。我会修正我的答案谢谢你理解我的查询,vry less ppl到达那个pt…:)for(inti=0;I标签我们需要获得标签信息。。。我可以使用访问下一个标记的语法吗..我知道nextsibling(),但它没有帮助..“its not do it”不是一个有用的语句。您可以编辑您的问题,以准确显示您正在使用的输入、您尝试的代码、您收到的输出以及您期望的输出。这就是一个好问题的写法。@lwburk我已经更新了确切的代码副本,让你明白我需要什么