Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.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为“返回null”;节点";当isNameSpaceAware和isValidating为;“真的”;_Java_Xpath - Fatal编程技术网

Java XPath为“返回null”;节点";当isNameSpaceAware和isValidating为;“真的”;

Java XPath为“返回null”;节点";当isNameSpaceAware和isValidating为;“真的”;,java,xpath,Java,Xpath,当我试图解析XML文件时,得到一个空节点 XPath xPath = XPathFactory.newInstance().newXPath(); Node node = null; try { node = (Node) xPath.evaluate( "/mynode", doc, XPathConstants.NODE); 我只在案例中面对这个问题- 1.Doc

当我试图解析XML文件时,得到一个空节点

XPath xPath = XPathFactory.newInstance().newXPath();
    Node node = null;
    try {
        node = (Node) xPath.evaluate(
                "/mynode",
                doc,
                XPathConstants.NODE);
我只在案例中面对这个问题-
1.DocumentBuilderFactory-setNameSpaceAware为true
2.DocumentBuilderFactory-setValidating为true

如果这些设置为false,那么我将得到正确的结果。有人能帮助我理解将这些属性设置为false的关系吗? (我已经核对了问题,但并没有消除我的疑虑)

这是xml-

<?xml version="1.0" encoding="UTF-8"?>
<mynode xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.example.com" xsi:schemaLocation="http://www.example.com example.xsd">
    <name>TargetName</name>
    <desc>desc goes here</desc>
    <pack>my.this</pack>
    <object>my.ExampleObject</object>
    <properties>
        <attrib>
            <name>id</name>
            <value>ZZZ</value>
        </attrib>
        <attrib>
            <name>ind</name>
            <value>X</value>
        </attrib>
    </properties>
    <children>
        <child>
            <name>childnodename</name>
            <desc>description goes here</desc>
            <invalues>
                <scope>ALL</scope>
            </invalues>
            <outvalues>
                <scope>ALL</scope>
            </outvalues>
            <akey>
                <aname>AAA</aname>
                <key></key>
            </akey>
            <msg>
                <success>code1</success>
                <failure>code2</failure>
            </msg>
        </child>
    </children>
</mynode>

目标名
笛卡尔在这里
我的,这个
my.ExampleObject
身份证件
ZZZ
ind
X
柴丁胺
这里有描述
全部的
全部的
AAA
代码1
代码2

XML支持名称空间。每个XML元素(和属性)都有一个关联的名称空间;如果未另行指定,则为空(默认)命名空间


在您的例子中,您试图读取的XML文档可能使用名称空间,而您的XPath查询似乎只查询emtpy名称空间。所以你不会得到结果。确保使用正确的名称空间,它就会工作。

最快的修复方法是不要执行
setNamespaceAware(true):-)但是,如果您想要一个名称空间感知的XPath,那么您会遇到一个典型的问题-,即XPath不支持默认名称空间的概念

因此,XPath必须使用名称空间前缀,以便查询查找任何节点。但是,您可以在实例上设置一个,以将名称空间前缀或默认名称空间解析为URI。实现此目的的一种方法,例如:

import java.util.*;
import java.io.ByteArrayInputStream;
import javax.xml.namespace.NamespaceContext;
import javax.xml.parsers.*;
import javax.xml.xpath.*;
import org.w3c.dom.*;

public class XmlParse {
    public static void main(String[] args) throws Exception {

        String xml =
            "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
            "<mynode xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://www.example.com\" xsi:schemaLocation=\"http://www.example.com example.xsd\">" +
            "<name>TargetName</name>" +
            "</mynode>";
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        dbf.setNamespaceAware(true);
        DocumentBuilder builder = dbf.newDocumentBuilder();
        Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));

        final String nonameNamespace = doc.getFirstChild().getNamespaceURI();

        NamespaceContext ctx = new NamespaceContext() {
            public String getNamespaceURI(String prefix) {
                String uri = null;
                if (prefix.equals("n")) {
                    uri = nonameNamespace;
                }
                return uri;
            }

            @Override
            public Iterator getPrefixes(String val) {
                throw new IllegalAccessError("Not implemented!");
            }

            @Override
            public String getPrefix(String uri) {
                throw new IllegalAccessError("Not implemented!");
            }
        };

        XPath xPath = XPathFactory.newInstance().newXPath();
        xPath.setNamespaceContext(ctx);


        Node node = null;
        try {
            node = (Node) xPath.evaluate("/n:mynode/n:name", doc, XPathConstants.NODE);
            System.out.println(node.getNodeName());
            System.out.println(node.getFirstChild().getNodeValue());
        } catch (Exception e) {

        }
    }
}
import java.util.*;
导入java.io.ByteArrayInputStream;
导入javax.xml.namespace.NamespaceContext;
导入javax.xml.parsers.*;
导入javax.xml.xpath.*;
导入org.w3c.dom.*;
公共类XmlParse{
公共静态void main(字符串[]args)引发异常{
字符串xml=
"" +
"" +
“TargetName”+
"";
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder=dbf.newDocumentBuilder();
Document doc=builder.parse(新的ByteArrayInputStream(xml.getBytes());
最后一个字符串NoNamespace=doc.getFirstChild().getNamespaceURI();
NamespaceContext ctx=新的NamespaceContext(){
公共字符串getNamespaceURI(字符串前缀){
字符串uri=null;
if(前缀等于(“n”)){
uri=非最小空间;
}
返回uri;
}
@凌驾
公共迭代器getPrefixes(字符串val){
抛出新的IllegaAccessError(“未实现!”);
}
@凌驾
公共字符串getPrefix(字符串uri){
抛出新的IllegaAccessError(“未实现!”);
}
};
XPath=XPathFactory.newInstance().newXPath();
setNamespaceContext(ctx);
Node=null;
试一试{
node=(node)xPath.evaluate(“/n:mynode/n:name”,doc,XPathConstants.node);
System.out.println(node.getNodeName());
System.out.println(node.getFirstChild().getNodeValue());
}捕获(例外e){
}
}
}

因此,这将把默认名称空间(
xmlns
)解析为
http://www.example.com
当遇到前缀为
n
的节点时。

是。我的XML文件使用名称空间。但我没有明白你的第二点。对不起,我是XPath相关知识的新手。请详细说明如何执行此操作好吗?-“您的XPath查询似乎只查询emtpy命名空间。因此您无法返回结果。请确保使用正确的命名空间,它将正常工作。”