2012-01-20 14 views
7

Mam następujący przykład XML:Odzyskiwanie Przestrzenie nazw z elementu w Java (przy użyciu DOM)

<?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> 

Moim problemem jest to, ze Query elementu. Ma atrybut Namespace, aw java potrzebny jest namespaceURI w celu pobrania wartości.

Moje pytanie brzmi: w jaki sposób mogę pobrać listę obszarów nazw z głównego elementu (w tym przypadku elementu OpenSearchDescription)? Chcę identyfikatora URI atrybutu, prefiksu i przestrzeni nazw, który można użyć do żądania na Query.

Dzięki.

PS: Używam DOM w java, standard w Java SE. Jestem skłonny przejść na XPath, jeśli to możliwe. Wymagane jest, aby był używany tylko Java Standard API.

Odpowiedz

14

To może być zacząć, factory.setNamespaceAware(true) jest kluczem do uzyskania wszystkich danych przestrzeni nazw.

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

Dzięki, mam podobny kod. Chodzi o to, aby zawsze sprawdzić, czy 'Zwraca' Node.getNamespaceURI() 'nie ma wartości' null'. Tak właśnie sprawdzam. To działa. –

0

Nie wiem, czy jest to właściwy sposób, ale co można zrobić, to po prostu wziąć atrybuty na OpenSearchDescription, dowiedzieć się, czy są deklaracje przestrzeni nazw za pomocą stałych znajdujących się w javax.xml.XMLConstants np. XMLNS_ATTRIBUTE stała powinna być "xmlns". Możesz przechodzić przez wszystkie atrybuty i zapisywać wszystkie atrybuty zaczynające się od tej wartości jako swoje NameSpaceUri.

Myślę, że powinieneś również rzucić okiem na NameSpaceContext. Nie wiem, jak załadować dokument, ale jeśli używasz XMLStreamReader, możesz pobrać z niego NameSpaceContext, który zawiera dokładnie potrzebne informacje. Here można zobaczyć, gdzie można odzyskać NameSpaceContext w inny sposób.

Nadzieję, że pomaga.

Powiązane problemy