Лучший способ прочитать пространство имен из потока XML (с использованием Java)

#java #xml #namespaces

#java #xml #пространства имен

Вопрос:

Мне было интересно, есть ли у людей какие-либо мнения по следующему поводу.

У меня есть 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) — и наиболее производительный.

Спасибо за любую помощь и предложения

Роб

Комментарии:

1. Чтобы уточнить, это строка ‘ example.com/AttribElemClashes ‘ что я хотел бы в этом случае — спасибо

Ответ №1:

Вы можете использовать синтаксический анализатор stax, такой как woodstox, поскольку он будет хорошо работать даже с большими 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-код.
Я предлагаю вам больше не искать в 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());
             }

         }



   }
  

Ответ №3:

Вы не должны видеть здесь столкновения, тот факт, что ваш атрибут и дочерний элемент называются «столкновение», действительно не должен быть проблемой.

У вас вообще запущен существующий анализатор? Возникают ли трудности с этим, например, выбрасывание исключений, неспособность выполнять то, что вы ожидаете?

Комментарии:

1. Привет, Брайан, XML действительно хорош — это всего лишь тестовый код, который я взял в качестве примера. Мой вопрос более общий. Как люди думают, это самый простой и безопасный способ извлечь пространство имен из XML, подобный этому. — спасибо, Роб

2. SAX чрезвычайно быстр, он запускает метод «event» каждый раз, когда попадает в элемент, например: public void startElement(String namespaceURL, String localName, String qname, Attributes attributes) . Затем вы можете делать с этой информацией все, что захотите.