Java中带名称空间的XPath

Java中带名称空间的XPath,java,xpath,namespaces,Java,Xpath,Namespaces,我希望获得标记之间的所有内容,但由于urn:名称空间的原因,我不知道如何做到这一点 <urn:ResponseStatus version="1.0" xmlns:urn="urn:camera-org"> <urn:requestURL>/CAMERA/Streaming/status</urn:requestURL> <urn:statusCode>4</urn:statusCode> <urn:statusString&g

我希望获得标记之间的所有内容,但由于urn:名称空间的原因,我不知道如何做到这一点

<urn:ResponseStatus version="1.0" xmlns:urn="urn:camera-org">

<urn:requestURL>/CAMERA/Streaming/status</urn:requestURL>
<urn:statusCode>4</urn:statusCode>
<urn:statusString>Invalid Operation</urn:statusString>
<urn:id>0</urn:id>

</urn:ResponseStatus>

/摄像机/流媒体/状态
4.
无效操作
0
有什么想法吗

  • 简短回答:使用XPath
    local-name()
    。如下所示:
    xPathFactory.newXPath().compile(“/*[local-name()='requestURL']/text()”)将返回
    /CAMERA/Streaming/status
  • 或者,您可以实现映射名称空间名称和URI的
    NamespaceContext
    ,并在查询之前在XPath对象上设置它
  • 看看这篇,更新:这篇文章已经发表了,你可以在
  • 溶液1样品:

    XPath xpath = XPathFactory.newInstance().newXPath();
    String responseStatus = xpath.evaluate("//*[local-name()='ResponseStatus']/text()", document);
    System.out.println("-> " + responseStatus);
    
    溶液2样品:

    // load the Document
    Document document = ...;
    NamespaceContext ctx = new NamespaceContext() {
        public String getNamespaceURI(String prefix) {
            return prefix.equals("urn") ? "urn:camera-org" : null; 
        }
        public Iterator getPrefixes(String val) {
            return null;
        }
        public String getPrefix(String uri) {
            return null;
        }
    };
    XPath xpath = XPathFactory.newInstance().newXPath();
    xpath.setNamespaceContext(ctx);
    String responseStatus = xpath.evaluate("//urn:ResponseStatus/text()", document);
    System.out.println("-> " + responseStatus);
    
    编辑

    这是一个完整的示例,它正确地检索元素:

    String xml = "<urn:ResponseStatus version=\"1.0\" xmlns:urn=\"urn:camera-org\">\r\n" + //
            "\r\n" + //
            "<urn:requestURL>/CAMERA/Streaming/status</urn:requestURL>\r\n" + //
            "<urn:statusCode>4</urn:statusCode>\r\n" + //
            "<urn:statusString>Invalid Operation</urn:statusString>\r\n" + //
            "<urn:id>0</urn:id>\r\n" + //
            "\r\n" + //
            "</urn:ResponseStatus>";
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    factory.setNamespaceAware(true);
    DocumentBuilder builder = factory.newDocumentBuilder();
    Document doc = builder.parse(new java.io.ByteArrayInputStream(xml.getBytes()));
    XPath xpath = XPathFactory.newInstance().newXPath();
    xpath.setNamespaceContext(new NamespaceContext() {
        public String getNamespaceURI(String prefix) {
            return prefix.equals("urn") ? "urn:camera-org" : null;
        }
    
        public Iterator<?> getPrefixes(String val) {
            return null;
        }
    
        public String getPrefix(String uri) {
            return null;
        }
    });
    XPathExpression expr = xpath.compile("//urn:ResponseStatus");
    Object result = expr.evaluate(doc, XPathConstants.NODESET);
    NodeList nodes = (NodeList) result;
    for (int i = 0; i < nodes.getLength(); i++) {
        Node currentItem = nodes.item(i);
        System.out.println("found node -> " + currentItem.getLocalName() + " (namespace: " + currentItem.getNamespaceURI() + ")");
    }
    
    String xml=“\r\n”+//
    “\r\n”+//
    “/CAMERA/Streaming/status\r\n”+//
    “4\r\n”+//
    “无效操作\r\n”+//
    “0\r\n”+//
    “\r\n”+//
    "";
    DocumentBuilderFactory工厂=DocumentBuilderFactory.newInstance();
    factory.setNamespaceAware(true);
    DocumentBuilder=factory.newDocumentBuilder();
    Document doc=builder.parse(新的java.io.ByteArrayInputStream(xml.getBytes());
    XPath=XPathFactory.newInstance().newXPath();
    setNamespaceContext(新的NamespaceContext(){
    公共字符串getNamespaceURI(字符串前缀){
    返回前缀.equals(“urn”)?“urn:camera org”:null;
    }
    公共迭代器getPrefixes(字符串val){
    返回null;
    }
    公共字符串getPrefix(字符串uri){
    返回null;
    }
    });
    XPathExpression expr=xpath.compile(“//urn:ResponseStatus”);
    Object result=expr.evaluate(doc,XPathConstants.NODESET);
    节点列表节点=(节点列表)结果;
    对于(int i=0;i”+currentItem.getLocalName()+”(命名空间:“+currentItem.getNamespaceURI()+”);
    }
    
    XML与

    简单XML


    你在用什么图书馆?您是否尝试使用javax.xml.xpath.xpath在查询前面加上
    urn:
    ;我试过用urn:但没用。回答得好!(如果代码缩进并且示例XML没有被他自己的服务器吃掉,那么这篇博客文章会更有用。哦,好吧,最后还是一个有用的列表。)非常感谢!!我使用此逻辑解析了一个庞大复杂的xml文件,它对我起了作用。
    getNamespaceURI
    应该返回
    xmlcants.NULL\NS\u URI
    (这是一个空字符串)当它与任何注册前缀不匹配时,它不会为null。该网站现在只返回一个内部服务器错误。全部:我通过webarchive更新了答案,并通过指向第3点中原始博客文章的链接
    String namespaceXML = "<?xml version='1.0' ?><information><person id='1'><name>Deep</name><age>34</age><gender>Male</gender></person>  <person id='2'><name>Kumar</name><age>24</age><gender>Male</gender></person> <person id='3'><name>Deepali</name><age>19</age><gender>Female</gender></person><!-- more persons... --></information>";
    String jsonString = "{}";
    String expression = "//information";
    
    String namespaceXML = "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"><soap:Body><m:NumberToDollarsResponse xmlns:m=\"http://www.dataaccess.com/webservicesserver/\"><m:NumberToDollarsResult>nine hundred and ninety nine dollars</m:NumberToDollarsResult></m:NumberToDollarsResponse></soap:Body></soap:Envelope>";
    String jsonString = "{'soap':'http://schemas.xmlsoap.org/soap/envelope/', 'm':'http://www.dataaccess.com/webservicesserver/'}";
    String expression = "//m:NumberToDollarsResponse/m:NumberToDollarsResult/text()";
    
    public static String asscerionXpath(String namespaceXML, String jsonString, String expression){
        if(namespaceXML.indexOf("><") > -1) namespaceXML = namespaceXML.replace("><", ">\r\n<");
        if(jsonString.indexOf("'") > -1)    jsonString = jsonString.replace("'", "\"");
    
        System.out.println("namespaceXML : \n"+namespaceXML);
        System.out.println("nsmespaces : \n"+jsonString);
    
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setValidating(false);
        factory.setNamespaceAware(true);
        factory.setIgnoringComments(true);
        factory.setIgnoringElementContentWhitespace(true);
        try {
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document source = builder.parse( string2Source(namespaceXML) );
            XPath xpath = XPathFactory.newInstance().newXPath();
    
            addNameSpaces(jsonString, xpath);
            // An XPath expression is not thread-safe. Make sure it is accessible by only one Thread.
            XPathExpression expr = xpath.compile(expression);
    
            // The NodeList interface provides the abstraction of an ordered collection of nodes,
            NodeList nodes = (org.w3c.dom.NodeList) expr.evaluate(source, XPathConstants.NODESET);;
            Node tree_base = nodes.item(0);
            return document2String(tree_base);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (XPathExpressionException e) {
            System.out.println("If the expression cannot be evaluated.");
        }
        return "";
    }
    static InputSource string2Source( String str ) {
        InputSource inputSource = new InputSource( new StringReader( str ) );
        return inputSource;
    }
    static void addNameSpaces(String jsonString, XPath xpath) {
        JSONParser parser = new JSONParser();
        try {
            JSONObject namespaces = (JSONObject) parser.parse(jsonString);
    
            if (namespaces.size() > 0) {
                final JSONObject declaredPrefix = namespaces; // To access in Inner-class.
                NamespaceContext nameSpace = new NamespaceContext() {
                    // To get all prefixes bound to a Namespace URI in the current scope, XPath 1.0 specification
                    // --> "no prefix means no namespace"
                    public String getNamespaceURI(String prefix) {
                        Iterator<?> key = declaredPrefix.keySet().iterator();
                        System.out.println("Keys : "+key.toString());
                        while (key.hasNext()) {
                            String name = key.next().toString();
                            if (prefix.equals(name)) {
                                System.out.println(declaredPrefix.get(name));
                                return declaredPrefix.get(name).toString();
                            }
                        }
                        return "";
                    }
                    public Iterator<?> getPrefixes(String val) {
                        return null;
                    }
                    public String getPrefix(String uri) {
                        return null;
                    }
                };// Inner class.
    
                xpath.setNamespaceContext( nameSpace );
            }
    
        } catch ( org.json.simple.parser.ParseException e) {
            e.printStackTrace();
        }
    }