如何使用 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:
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 数据文件中恢复特定数据这一主题的所有痛苦的最终结果。我要感谢所有帮助我解决问题的人 - 无论这是否是我正在寻找的东西,他们让我思考并导致了解决方案...
我必须解析的 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:
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 数据文件中恢复特定数据这一主题的所有痛苦的最终结果。我要感谢所有帮助我解决问题的人 - 无论这是否是我正在寻找的东西,他们让我思考并导致了解决方案...