Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从XML流读取名称空间的最佳方法(使用Java)_Java_Xml_Namespaces - Fatal编程技术网

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

从XML流读取名称空间的最佳方法(使用Java),java,xml,namespaces,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:MatchingEle

我想知道人们是否对以下几点有一些看法

我有如下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中实现这一点的最佳方法是什么?性能最好的方法是什么

谢谢你的帮助和建议


Rob

您不应该在这里看到冲突,您的属性和子元素都被称为“clash”这一事实不应该成为问题


您是否有一个正在运行的解析器?它在这方面有困难吗,例如抛出异常,无法完成预期的任务?

您可以使用类似woodstox的stax解析器,因为它即使在大型XML中也能很好地执行。它以流的形式加载XML,您将获得元素开头的事件。它还提供了一种将元素的QName(限定名)作为对象获取的方法,该对象的命名空间也可以作为属性使用


看看如何读取使用名称空间的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>

好啊
通过访问AlchemyAPI或使用AlchemyAPI生成的信息,您同意受AlchemyAPI使用条款的约束:http://www.alchemyapi.com/company/terms.html
英语
0.9683
访问控制
对于上面的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());
             }

         }



   }
import javax.xml.parsers.*;
DocumentBuilderFactory工厂=DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder docBuilder=factory.newDocumentBuilder();
org.w3c.dom.Document doc=docBuilder.parse(新的InputSource(新的StringReader(strAbstractRdf));
NodeList nl=doc.getelementsbytagnames(“*”,“Description”)//标记名
对于(int kk=0;kk0)
{
元素eTermName=(元素)nlTermName.item(0);
System.out.println(eTermName.getTextContent());
}
}
}

嗨,Brian,XML确实很好——这只是我作为示例抓取的一些测试代码。我的问题比较笼统。人们认为从XML中检索名称空间的最简单、最安全的方法是什么谢谢,RobSAX非常快,它每次命中元素时都会触发一个“事件”方法,例如:
public void startElement(String namespaceURL、String localName、String qname、Attributes Attributes)
。然后,您可以使用此信息执行任何操作。为了澄清,在本例中,我希望使用字符串“”-谢谢