2011-05-11 23 views
2

我想知道人們是否對以下內容有一些意見。從XML流中讀取命名空間的最佳方法(使用Java)

我有這樣的XML片段:

<?xml version="1.0" encoding="UTF-8"?> 
<clashes:MatchingElementAndAttribute xmlns:clashes="http://example.com/AttribElemClashes" clash="123"> 
     <clash>strval</clash> 
</clashes:MatchingElementAndAttribute> 

而且我希望能夠提取XML片段的命名空間。

這樣做的最好方法是什麼(在Java內部) - 而且是最高性能的。

感謝所有幫助和建議

羅布

+0

爲了澄清,這是字符串「http://example.com/AttribElemClashes」,我想在這種情況下 - 謝謝 – Rob 2011-05-11 09:19:19

回答

0

你不應該在這裏看到的衝突,事實上,你的屬性和子元素都被稱爲「衝突」真的不應該是一個問題。

您是否有現成的解析器運行?這是否有困難,例如拋出異常,沒有達到你的期望?

+0

嗨,布萊恩,XML確實很好 - 這只是我抓住的一些測試代碼作爲例子。我的問題是一個更通用的問題。人們認爲什麼是最簡單和最安全的方式來從XML中檢索名稱空間。 - 謝謝,Rob – Rob 2011-05-11 09:07:45

+1

SAX非常快速,它每次遇到一個元素時都會觸發一個「事件」方法,例如:'public void startElement(String namespaceURL,String localName,String qname,Attributes attributes)'。你可以用這個信息做任何你喜歡的事情。 – Brian 2011-05-11 11:38:04

2

您可以像使用woodstox一樣使用stax分析器,因爲即使使用大型XML,它也可以很好地運行。它將XML加載爲流,並且您將獲得元素開始的事件。它還提供了一種將元素的QName(限定名稱)作爲對象的方法,該對象也具有作爲屬性提供的名稱空間。

看一看http://www.xml.com/pub/a/2003/09/17/stax.html

2

使用命名空間讀取XML。 請準確使用以下代碼,而不需要做任何更改。

<?xml version="1.0" encoding="UTF-8" standalone="no"?><rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:aapi="http://rdf.alchemyapi.com/rdf/v1/s/aapi-schema#" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:owl="http://www.w3.org/2002/07/owl#" xml:base="http://rdf.alchemyapi.com/rdf/v1/r/response.rdf"> 
<rdf:Description rdf:ID="d1dfa235105c033dec6dffdff63239d8b802087d9"> 
    <rdf:type rdf:resource="http://rdf.alchemyapi.com/rdf/v1/s/aapi-schema#DocInfo"/> 
    <aapi:ResultStatus>OK</aapi:ResultStatus> 
    <aapi:Usage>By accessing AlchemyAPI or using information generated by AlchemyAPI, you are agreeing to be bound by the AlchemyAPI Terms of Use: http://www.alchemyapi.com/company/terms.html</aapi:Usage> 
    <aapi:URL/> 
    <aapi:Language>english</aapi:Language> 
</rdf:Description> 
<rdf:Description > 

    <aapi:Relevance>0.9683</aapi:Relevance> 
    <aapi:Name>Access control</aapi:Name> 
     <owl:sameAs rdf:resource="http://dbpedia.org/resource/Access_control"/> 
     <owl:sameAs rdf:resource="http://rdf.freebase.com/ns/guid.9202a8c04000641f8000000000051124"/> 
</rdf:Description> 

對於上述XML,您可以使用以下良好的Java代碼。 我建議你不要在谷歌這個代碼的測試前再通過自己的搜索:

import javax.xml.parsers.*; 

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
     factory.setNamespaceAware(true); 

     DocumentBuilder docBuilder = factory.newDocumentBuilder(); 

    org.w3c.dom.Document doc = docBuilder.parse(new InputSource(new StringReader(strAbstractRdf))); 

    NodeList nl = doc.getElementsByTagNameNS("*","Description"); //the tag name 

    for (int kk=0;kk< nl.getLength(); kk++) 
    { 
     Node eDes = nl.item(kk); 
     if(eDes.getNodeType() == Node.ELEMENT_NODE) 
     { 

      Element eDescrition = (Element)eDes; 
      NodeList nlTermName= eDescrition.getElementsByTagNameNS("*","Relevance"); 
      if(nlTermName.getLength() > 0) 
      { 
       Element eTermName =(Element) nlTermName.item(0); 
       System.out.println(eTermName.getTextContent()); 
      } 

     } 



    }