Java 我应该如何选择XML;名称空间;使用org.w3c.dom.node.getNamedItemNS(nsUri,name)的节点?

Java 我应该如何选择XML;名称空间;使用org.w3c.dom.node.getNamedItemNS(nsUri,name)的节点?,java,xml,namespaces,Java,Xml,Namespaces,这是xml: <xml xmlns:log="http://sample.com"> <test log:writer="someWriter" /> </xml> 我还尝试放置xmlns:log=”http://sample.com“test”节点上的声明,但我始终收到一个NullPointerException。用于文档的DocumentBuilderFactory也启用了setNamespaceAware。有任何提示吗?getNamedItem

这是xml:

<xml xmlns:log="http://sample.com">

  <test log:writer="someWriter" />

</xml>

我还尝试放置xmlns:log=”http://sample.com“test”节点上的声明,但我始终收到一个
NullPointerException
。用于
文档的
DocumentBuilderFactory
也启用了
setNamespaceAware
。有任何提示吗?

getNamedItemNS将namespaceURI作为其第一个参数(即
http://sample.com
),而不是前缀(
log

编辑:

这里有一个完整的测试用例。这将打印出“属性值是someWriter”。使用Xerces作为XML库进行测试。这对你有用吗

import java.io.IOException;
import java.io.StringReader;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;


public class GetNamedItemNSTester
{
    public static void main(String[] args)
    {
        new GetNamedItemNSTester();     
    }

    String xml = "<xml xmlns:log=\"http://sample.com\">\n" +
            "\n" +
            "<test log:writer=\"someWriter\" />\n" +
            "\n" +
            "</xml>";


    public GetNamedItemNSTester()
    {
        StringReader xmlReader = new StringReader(xml);
        try
        {
            DocumentBuilderFactory factory =
                DocumentBuilderFactory.newInstance();
            factory.setNamespaceAware(true);
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document doc = builder.parse(new InputSource(xmlReader));

            Element currentNode =
                (Element)doc.getElementsByTagName("test").item(0);
            String attributeValue = currentNode.getAttributes()
                .getNamedItemNS("http://sample.com", "writer").getNodeValue();
            System.out.println("Attribute value is " + attributeValue);
        }
        catch (ParserConfigurationException e)
        {
            e.printStackTrace();
        }
        catch (SAXException e)
        {
            e.printStackTrace();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        finally
        {
            xmlReader.close();
        }
    }
}
import java.io.IOException;
导入java.io.StringReader;
导入javax.xml.parsers.DocumentBuilder;
导入javax.xml.parsers.DocumentBuilderFactory;
导入javax.xml.parsers.parserConfiguration异常;
导入org.w3c.dom.Document;
导入org.w3c.dom.Element;
导入org.xml.sax.InputSource;
导入org.xml.sax.SAXException;
公共类GetNamedItemNSTester
{
公共静态void main(字符串[]args)
{
新的GetNamedItemNSTester();
}
字符串xml=“\n”+
“\n”+
“\n”+
“\n”+
"";
公共GetNamedItemNSTester()
{
StringReader xmlReader=新的StringReader(xml);
尝试
{
文档建设者工厂=
DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder=factory.newDocumentBuilder();
documentdoc=builder.parse(新的InputSource(xmlReader));
元素当前节点=
(元素)文件getElementsByTagName(“测试”)。项(0);
字符串attributeValue=currentNode.getAttributes()
.GetNamedItems(“http://sample.com“,”writer“).getNodeValue();
System.out.println(“属性值为”+attributeValue);
}
捕获(ParserConfiguration异常e)
{
e、 printStackTrace();
}
捕获(SAXE异常)
{
e、 printStackTrace();
}
捕获(IOE异常)
{
e、 printStackTrace();
}
最后
{
xmlReader.close();
}
}
}

@Steel Plume-我添加了一个完整的测试用例,您可以将其与代码进行比较。非常感谢!我发现自定义XML加载程序有一个内部自定义导入例程,它从新导入的XML节点中清除了所有xmlns节点。
import java.io.IOException;
import java.io.StringReader;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;


public class GetNamedItemNSTester
{
    public static void main(String[] args)
    {
        new GetNamedItemNSTester();     
    }

    String xml = "<xml xmlns:log=\"http://sample.com\">\n" +
            "\n" +
            "<test log:writer=\"someWriter\" />\n" +
            "\n" +
            "</xml>";


    public GetNamedItemNSTester()
    {
        StringReader xmlReader = new StringReader(xml);
        try
        {
            DocumentBuilderFactory factory =
                DocumentBuilderFactory.newInstance();
            factory.setNamespaceAware(true);
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document doc = builder.parse(new InputSource(xmlReader));

            Element currentNode =
                (Element)doc.getElementsByTagName("test").item(0);
            String attributeValue = currentNode.getAttributes()
                .getNamedItemNS("http://sample.com", "writer").getNodeValue();
            System.out.println("Attribute value is " + attributeValue);
        }
        catch (ParserConfigurationException e)
        {
            e.printStackTrace();
        }
        catch (SAXException e)
        {
            e.printStackTrace();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        finally
        {
            xmlReader.close();
        }
    }
}