2010-07-31 37 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