Find all namespace declarations in an XML document - xPath 1.0 vs xPath 2.0

后端 未结 4 2080
渐次进展
渐次进展 2021-02-03 14:34

As part of a Java 6 application, I want to find all namespace declarations in an XML document, including any duplicates.

Edit: Per Martin\'s request, h

4条回答
  •  猫巷女王i
    2021-02-03 15:37

    Here are my results using the XPath 1.0 implementations of .NET's XPathDocument (XSLT/XPath 1.0 data model), XmlDocument (DOM data model) and MSXML 6's DOM; the test code run against your sample XML document is

        Console.WriteLine("XPathDocument:");
        XPathDocument xpathDoc = new XPathDocument("../../XMLFile4.xml");
        foreach (XPathNavigator nav in xpathDoc.CreateNavigator().Select("//namespace::*"))
        {
            Console.WriteLine("Node type: {0}; name: {1}; value: {2}.", nav.NodeType, nav.Name, nav.Value);
        }
        Console.WriteLine();
    
        Console.WriteLine("DOM XmlDocument:");
        XmlDocument doc = new XmlDocument();
        doc.Load("../../XMLFile4.xml");
        foreach (XmlNode node in doc.SelectNodes("//namespace::*"))
        {
            Console.WriteLine("Node type: {0}; name: {1}; value: {2}.", node.NodeType, node.Name, node.Value);
        }
        Console.WriteLine();
    
    
        Console.WriteLine("MSXML 6 DOM:");
        dynamic msxmlDoc = Activator.CreateInstance(Type.GetTypeFromProgID("Msxml2.DOMDocument.6.0"));
        msxmlDoc.load("../../XMLFile4.xml");
        foreach (dynamic node in msxmlDoc.selectNodes("//namespace::*"))
        {
            Console.WriteLine("Node type: {0}; name: {1}; value: {2}.", node.nodeType, node.name, node.nodeValue);
        }
    

    and its output is

    XPathDocument:
    Node type: Namespace; name: txt; value: textnode.com.
    Node type: Namespace; name: att; value: attribute.com.
    Node type: Namespace; name: ele; value: element.com.
    Node type: Namespace; name: xml; value: http://www.w3.org/XML/1998/namespace.
    Node type: Namespace; name: txt; value: textnode.com.
    Node type: Namespace; name: att; value: attribute.com.
    Node type: Namespace; name: ele; value: element.com.
    Node type: Namespace; name: xml; value: http://www.w3.org/XML/1998/namespace.
    Node type: Namespace; name: txt; value: textnode.com.
    Node type: Namespace; name: att; value: attribute.com.
    Node type: Namespace; name: ele; value: element.com.
    Node type: Namespace; name: xml; value: http://www.w3.org/XML/1998/namespace.
    Node type: Namespace; name: txt; value: textnode.com.
    Node type: Namespace; name: att; value: attribute.com.
    Node type: Namespace; name: ele; value: element.com.
    Node type: Namespace; name: xml; value: http://www.w3.org/XML/1998/namespace.
    
    DOM XmlDocument:
    Node type: Attribute; name: xmlns:txt; value: textnode.com.
    Node type: Attribute; name: xmlns:att; value: attribute.com.
    Node type: Attribute; name: xmlns:ele; value: element.com.
    Node type: Attribute; name: xmlns:xml; value: http://www.w3.org/XML/1998/namespa
    ce.
    Node type: Attribute; name: xmlns:txt; value: textnode.com.
    Node type: Attribute; name: xmlns:att; value: attribute.com.
    Node type: Attribute; name: xmlns:ele; value: element.com.
    Node type: Attribute; name: xmlns:xml; value: http://www.w3.org/XML/1998/namespa
    ce.
    Node type: Attribute; name: xmlns:txt; value: textnode.com.
    Node type: Attribute; name: xmlns:att; value: attribute.com.
    Node type: Attribute; name: xmlns:ele; value: element.com.
    Node type: Attribute; name: xmlns:xml; value: http://www.w3.org/XML/1998/namespa
    ce.
    Node type: Attribute; name: xmlns:txt; value: textnode.com.
    Node type: Attribute; name: xmlns:att; value: attribute.com.
    Node type: Attribute; name: xmlns:ele; value: element.com.
    Node type: Attribute; name: xmlns:xml; value: http://www.w3.org/XML/1998/namespa
    ce.
    
    MSXML 6 DOM:
    Node type: 2; name: xmlns:xml; value: http://www.w3.org/XML/1998/namespace.
    Node type: 2; name: xmlns:ele; value: element.com.
    Node type: 2; name: xmlns:att; value: attribute.com.
    Node type: 2; name: xmlns:txt; value: textnode.com.
    Node type: 2; name: xmlns:xml; value: http://www.w3.org/XML/1998/namespace.
    Node type: 2; name: xmlns:ele; value: element.com.
    Node type: 2; name: xmlns:att; value: attribute.com.
    Node type: 2; name: xmlns:txt; value: textnode.com.
    Node type: 2; name: xmlns:xml; value: http://www.w3.org/XML/1998/namespace.
    Node type: 2; name: xmlns:ele; value: element.com.
    Node type: 2; name: xmlns:att; value: attribute.com.
    Node type: 2; name: xmlns:txt; value: textnode.com.
    Node type: 2; name: xmlns:xml; value: http://www.w3.org/XML/1998/namespace.
    Node type: 2; name: xmlns:ele; value: element.com.
    Node type: 2; name: xmlns:att; value: attribute.com.
    Node type: 2; name: xmlns:txt; value: textnode.com.
    

    So it is certainly not an XPath 1.0 versus XPath 2.0 problem. I think the problem you see is a shortcoming of mapping the XPath data model with namespace nodes against the DOM model with attribute nodes. Someone more familiar with the Java XPath API needs to tell you whether the behaviour you see is correctly implementation dependent as the API specification is not precise enough for the case of mapping the XPath namespace axis to the DOM model or whether it is a bug.

提交回复
热议问题