2012-01-20 26 views
7

私は次のXMLの例があります。取得名前空間

<?xml version="1.0" encoding="UTF-8"?> 
<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/" 
    xmlns:custom="http://example.com/opensearchextensions/1.0/"> 
    <ShortName>Test</ShortName> 
    <Description>Testing....</Description> 
    <Url template="whatever" type="what" /> 
    <Query custom:color="blue" role="example" /> 
</OpenSearchDescription> 

私の懸念はQuery要素です。これはNamespace属性を持ち、Javaでは値を取得するためにnamespaceURIが必要です。

質問:ルート要素(この場合はOpenSearchDescription要素)から名前空間のリストを取得するにはどうすればよいですか。私がQueryで要求するために使用できる属性、接頭辞、名前空間URIが必要です。

ありがとうございました。

PS:私はDOMでJavaを使用していますが、Java SEでは標準です。可能であれば、私はXPathに移ります。要件は、Java標準APIのみを使用する必要があることです。

答えて

14

これはおそらく、factory.setNamespaceAware(true)が名前空間データを取得するためのキーであることを意味します。

public static void main(String[] args) throws ParserConfigurationException, SAXException, 
     IOException 
{ 
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
    factory.setNamespaceAware(true); 
    DocumentBuilder builder = factory.newDocumentBuilder(); 
    Document doc = builder.parse(new File(args[0])); 
    Element root = doc.getDocumentElement(); 
    //prints root name space 
    printAttributesInfo((Node) root); 

    NodeList childNodes = root.getChildNodes(); 
    for (int i = 0; i < childNodes.getLength(); i++) 
    { 
     printAttributesInfo(childNodes.item(i)); 
    } 
} 

public static void printAttributesInfo(Node root) 
{ 
    NamedNodeMap attributes = root.getAttributes(); 
    if (attributes != null) 
    { 
     for (int i = 0; i < attributes.getLength(); i++) 
     { 
      Node node = attributes.item(i); 
      if (node.getNodeType() == Node.ATTRIBUTE_NODE) 
      { 
       String name = node.getNodeName(); 
       System.out.println(name + " " + node.getNamespaceURI()); 
      } 
     } 
    } 
} 
+1

ありがとう、私は同様のコードを持っています。問題は 'Node.getNamespaceURI()'が 'null'でないかどうかを常にチェックすることです。それが私がチェックする方法です。できます。 –

0

これは適切な方法であるかどうかわかりませんが、可能なことは、OpenSearchDescriptionの属性を取って、javax.xml.XMLConstantsにある定数の助けを借りて名前空間宣言であるかどうかを調べることです。 XMLNS_ATTRIBUTE定数は "xmlns"でなければなりません。すべての属性をトラバースし、その値で始まるすべての属性をNameSpaceUriのものとして保存できます。

NameSpaceContextもご覧ください。ドキュメントの読み込み方法はわかりませんが、XMLStreamReaderを使用している場合は、必要な情報を正確に保持するNameSpaceContextを取得できます。 Here他の方法でNameSpaceContextを取得できる場所がわかります。

希望に役立ちます。