从XML流中读取命名空间的最佳方法(使用Java)

时间:2011-05-11 08:58:33

标签: java xml namespaces

我想知道人们是否对以下内容有一些看法。

我有以下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中) - 性能最佳。

感谢您提供任何帮助和建议

罗布

3 个答案:

答案 0 :(得分:2)

你可以像woodstox一样使用stax解析器,因为即使使用大型XML也能很好地运行。它将XML作为流加载,您将获得元素启动的事件。它还提供了一种将元素的QName(限定名称)作为对象获取的方法,该对象也具有可用作属性的命名空间。

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

答案 1 :(得分: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代码。 我建议您在自己测试此代码之前不再在Google中搜索:

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

         }



   }

答案 2 :(得分:0)

你不应该在这里看到冲突,你的属性和子元素都被称为“冲突”的事实真的应该不是问题。

你有一个现有的解析器吗?它是否有困难,例如抛出异常,没有做到你期望的事情?