Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Xpath中的布尔运算:使用属性_Java_Xml_Xpath - Fatal编程技术网

Java Xpath中的布尔运算:使用属性

Java Xpath中的布尔运算:使用属性,java,xml,xpath,Java,Xml,Xpath,下面是.xml文件的一个片段。我做了以下工作: Document doc = docBuilder.parse(filesInDirectory.get(i)); doc.getDocumentElement().normalize(); XPath xPath = XPathFactory.newInstance().newXPath(); XPathExpression expr1 = xPath.compile("//codes[@ class ='class2']/code[@code]

下面是.xml文件的一个片段。我做了以下工作:

Document doc = docBuilder.parse(filesInDirectory.get(i));
doc.getDocumentElement().normalize();
XPath xPath = XPathFactory.newInstance().newXPath();
XPathExpression expr1 = xPath.compile("//codes[@ class ='class2']/code[@code]");
Object result1 = expr1.evaluate(doc, XPathConstants.NODESET);
NodeList nodes1 = (NodeList) result1;   
现在,

我想根据属性名做出逻辑决策,比如(伪代码)

我该怎么做

<metadata>
   <codes class="class1">
     <code code="ABC">
         <detail "blah" "blah">
     </code>
  </codes>
  <codes class="class2">
    <code code="123">
        <detail "blah blah"/>
    </code>
    <code code="456">
        <detail "blah blah"/>
    </code>
  </codes>
 </metadata>


这是:

XPathExpression expr1 = xPath.compile("//codes[@class]");
Object result1 = expr1.evaluate(doc, XPathConstants.NODESET);
NodeList nodes1 = (NodeList) result1; 
应该返回带有
class
属性的元素列表。迭代此节点列表,然后
foreach
节点提取
[@code]
元素,并使用如下检查

if (node.getNodeValue().equals("123"))
以确定节点是否具有要查找的值。

此操作:

应该返回带有
class
属性的元素列表。迭代此节点列表,然后
foreach
节点提取
[@code]
元素,并使用如下检查

if (node.getNodeValue().equals("123"))

要确定节点是否具有要查找的值。

请使用此XPath表达式:

/*/codes[@class]/code[@code = '123' or @code = '456']
<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/">
  <xsl:copy-of select=
  "/*/codes[@class]/code[@code = '123' or @code = '456']"/>
 </xsl:template>
</xsl:stylesheet>
它选择任何
code
元素,其
code
属性的字符串值是字符串
“123”
“456”
中的一个,并且该元素(该
code
元素)是
code
元素的子元素,该元素具有` class属性,并且是XML文档顶部元素的子元素

基于XSLT的验证

/*/codes[@class]/code[@code = '123' or @code = '456']
<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/">
  <xsl:copy-of select=
  "/*/codes[@class]/code[@code = '123' or @code = '456']"/>
 </xsl:template>
</xsl:stylesheet>

在提供的XML文档上应用此转换时(更正为格式正确):



计算XPath表达式并将所选节点复制到输出:

<code code="123">
   <detail/>
</code>
<code code="456">
   <detail/>
</code>

说明

/*/codes[@class]/code[@code = '123' or @code = '456']
<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/">
  <xsl:copy-of select=
  "/*/codes[@class]/code[@code = '123' or @code = '456']"/>
 </xsl:template>
</xsl:stylesheet>

正确使用标准XPath运算符使用此XPath表达式:

/*/codes[@class]/code[@code = '123' or @code = '456']
<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/">
  <xsl:copy-of select=
  "/*/codes[@class]/code[@code = '123' or @code = '456']"/>
 </xsl:template>
</xsl:stylesheet>
它选择任何
code
元素,其
code
属性的字符串值是字符串
“123”
“456”
中的一个,并且该元素(该
code
元素)是
code
元素的子元素,该元素具有` class属性,并且是XML文档顶部元素的子元素

基于XSLT的验证

/*/codes[@class]/code[@code = '123' or @code = '456']
<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/">
  <xsl:copy-of select=
  "/*/codes[@class]/code[@code = '123' or @code = '456']"/>
 </xsl:template>
</xsl:stylesheet>

在提供的XML文档上应用此转换时(更正为格式正确):



计算XPath表达式并将所选节点复制到输出:

<code code="123">
   <detail/>
</code>
<code code="456">
   <detail/>
</code>

说明

/*/codes[@class]/code[@code = '123' or @code = '456']
<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/">
  <xsl:copy-of select=
  "/*/codes[@class]/code[@code = '123' or @code = '456']"/>
 </xsl:template>
</xsl:stylesheet>
正确使用标准XPath运算符请尝试以下方法:

        File f = new File("test.xml");
        XPathFactory factory = XPathFactory.newInstance();
        XPath xpath = factory.newXPath();
        InputSource src = new InputSource(new FileInputStream(f));
        Object result = xpath.evaluate("//codes[@class='class2']/code/@code",src,XPathConstants.NODESET);
        NodeList lst = (NodeList)result;

        List<String> codeList = new ArrayList<String>();
        for(int idx=0; idx<lst.getLength(); idx++){
            codeList.add(lst.item(idx).getNodeValue());
        }
        if(codeList.contains("123")){
            System.out.println("123");
        }

        if(codeList.contains("123") && codeList.contains("456")){
            System.out.println("123 and 456");
        }
File f=新文件(“test.xml”);
XPathFactory=XPathFactory.newInstance();
XPath=factory.newXPath();
InputSource src=新的InputSource(新文件InputStream(f));
Object result=xpath.evaluate(“//code[@class='class2']/code/@code”,src,XPathConstants.NODESET);
节点列表lst=(节点列表)结果;
List codeList=新的ArrayList();
对于(intidx=0;idx请尝试以下方法:

        File f = new File("test.xml");
        XPathFactory factory = XPathFactory.newInstance();
        XPath xpath = factory.newXPath();
        InputSource src = new InputSource(new FileInputStream(f));
        Object result = xpath.evaluate("//codes[@class='class2']/code/@code",src,XPathConstants.NODESET);
        NodeList lst = (NodeList)result;

        List<String> codeList = new ArrayList<String>();
        for(int idx=0; idx<lst.getLength(); idx++){
            codeList.add(lst.item(idx).getNodeValue());
        }
        if(codeList.contains("123")){
            System.out.println("123");
        }

        if(codeList.contains("123") && codeList.contains("456")){
            System.out.println("123 and 456");
        }
File f=新文件(“test.xml”);
XPathFactory=XPathFactory.newInstance();
XPath=factory.newXPath();
InputSource src=新的InputSource(新文件InputStream(f));
Object result=xpath.evaluate(“//code[@class='class2']/code/@code”,src,XPathConstants.NODESET);
节点列表lst=(节点列表)结果;
List codeList=新的ArrayList();

for(int idx=0;idx对象NodeListNope没有名为getNodeValue的方法当然没有。但是有一个方法
item(int index)
返回一个节点,我假设您知道for循环的工作原理;)对象NodeListNope没有名为getNodeValue的方法当然没有。但是有一个方法
item(int index)
返回一个节点,我假设您知道for循环是如何工作的;)