如何使用 XMLreader 从 XML 文件中检索一段特定数据?

How do I retrieve one specific piece of data from a XML file using XMLreader?

我必须解析的 XML 数据的真实示例以及文件的配置方式。文件是这样呈现给我的。

<?xml version="1.0"?>
 <session>
  <values>
   <value id="FILE_CREATE_DATE">
    <timestamp>2012-04-16T21:33:31Z</timestamp>
   </value>
   <value id="LAST_ACCESSED">
    <timestamp>2012-09-17T17:15:23Z</timestamp>
   </value>
   <value id="VERSION_TIMESTAMP">
    <timestamp>2012-04-16T21:33:31Z</timestamp>
   </value>
 </values>
</session>

我需要进入这个文件并检索 FILE_CREATE_DATE 数据。

到目前为止我的代码:

    File xmlFile = new File(XMLFileData[i].getPath());
    FileInputStream myXMLStream = new FileInputStream(xmlFile);

    XMLInputFactory XMLFactory = XMLInputFactory.newInstance();
    XMLStreamReader XMLReader =  XMLFactory.createXMLStreamReader(myXMLStream);
    while(XMLReader.hasNext())
    {
       if (XMLReader.getEventType() == XMLStreamReader.START_ELEMENT)
       {        
          String XMLTag = XMLReader.getLocalName();
          if(XMLReader.hasText())
          {
             System.out.println(XMLReader.getText());
             break;
          }                            
       }    
       XMLReader.next();
    }

'getLocalName()' 函数 returns 'Sessions' 然后 'value' 然后 'values' 但永远不会 returns 元素的实际名称。我需要测试以查看我是否位于正确的元素然后从该元素检索数据...

您的 ID 不是元素 - 它是元素属性。

您应该阅读值节点的属性,请参阅 getAttributeValue 方法的 javadoc:

http://docs.oracle.com/javase/6/docs/api/javax/xml/stream/XMLStreamReader.html#getAttributeValue(java.lang.String,%20java.lang.String)

Returns the normalized attribute value of the attribute with the namespace and localName If the namespaceURI is null the namespace is not checked for equality

所以它将是:

String XMLTag = XMLReader.getLocalName();
if(XMLTag.equals("value")) {
   String idValue = XMLReader.getAttributeValue(null, "id");
   //here idValue will be equal to FILE_CREATE_DATE, LAST_ACCESSED or VERSION_TIMESTAMP
}

我使用 Jsoup,它是一个用于解析 HTML 的库。但它也可以用于 xml。您首先必须将 XML 文件加载到 Document 对象中,然后只需调用

doc.getElementById("FILE_CREATE_DATE");

这将 return 一个将时间戳作为子对象的 Element 对象。这是图书馆的 link:https://jsoup.org/

这是我在 Whosebug 上的第一个回答,如果有帮助请告诉我!

试试

if(XMLReader.getAttributeValue(0).equalIgnorecase("FILE_CREATE_DATE"))

getAttributeValue : Return 属性给定索引的值。

<value id="FILE_CREATE_DATE">

id 是第一个属性。所以 XMLReader.getAttributeValue(0)

但在调用它之前,您必须验证元素是否具有第一个属性。因为所有标签都没有至少 1 个属性。

在jsoup中你可以这样查询

public static void main(String[] args) {

Document doc;
try {
    doc = Jsoup.connect("http://www.dropbox.com/public/xml/yourfile.xml").userAgent("Mozilla").get();
    //<value id="FILE_CREATE_DATE">
    Elements links = doc.select("value[id=FILE_CREATE_DATE]");
    for (Element link : links) {            
        if(link.attr("id").contains("FILE_CREATE_DATE"))//find the link with some texts
        {
            System.out.println("here is the element you need");
        }
    }
} catch (IOException e) {
    e.printStackTrace();
}

}

XMLInputFactory XMLFactory = XMLInputFactory.newInstance();
            XMLStreamReader XMLReader = XMLFactory.createXMLStreamReader(myXMLStream);
            while(XMLReader.hasNext())
            {
                if (XMLReader.getEventType() == XMLStreamReader.START_ELEMENT)
                {        
                   String XMLTag = XMLReader.getLocalName();
                   if(XMLTag.equals("value"))
                   {
                      String idValue = XMLReader.getAttributeValue(null, "id");
                      if (idValue.equals("FILE_CREATE_DATE"))
                      {
                        System.out.println(idValue);
                        XMLReader.nextTag();
                        System.out.println(XMLReader.getElementText());

                      }
                   }
               }    
               XMLReader.next();
            }

所以这段代码是我对从 XML 数据文件中恢复特定数据这一主题的所有痛苦的最终结果。我要感谢所有帮助我解决问题的人 - 无论这是否是我正在寻找的东西,他们让我思考并导致了解决方案...