2010-07-31 57 views
1

这是XML:如何使用org.w3c.dom.Node.getNamedItemNS(nsUri,name)选择XML“namespaced”节点?

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

    <test log:writer="someWriter" /> 

</xml> 

我想获得的属性值“日志:作家”使用下面的代码行:

currentNode.getAttributes().getNamedItemNS("log", "writer") 

我想也放置的xmlns:日志=“http://sample.com”声明在“测试”节点上,但我总是收到一个NullPointerException。用于DocumentDocumentBuilderFactory也启用了setNamespaceAware。任何提示?

回答

4

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(); 
     } 
    } 
} 
+0

我试过了,但它不工作 – 2010-07-31 00:46:18

+0

@Steel羽 - 我添加了一个完整的测试情况下,这样你就可以把它比作你的代码。 – Alohci 2010-07-31 10:04:28

+0

非常感谢!我发现自定义XML加载程序有一个内部自定义导入例程,它从新导入的例程中清除所有xmlns节点。 – 2010-07-31 15:59:32