java - 用Java读取XML

标签 java xml

我想我的这个问题非常基本,但由于我以前从未这样做过,或者在我搜索这个问题时没有在互联网上遇到过任何好的东西,所以这里......

我有一个 XML,我希望我的 java 代码能够读取它。 XML 示例如下 --

<getLabel labelId="BLAH">

<dataObject name="packageInfo">
  <map>
    <entry><string>shipment_id</string><string>143486104007</string></entry>
    <entry><string>package_id</string><string>1</string></entry>
    <entry><string>station_id</string><string>308</string></entry>
            <entry><string>include_invoices</string><string>true</string></entry>      </map>
</dataObject>

<dataObject name="pcsp">
  <map>
    <entry><string>shipment_id</string><string>143486104007</string></entry>
    <entry><string>package_id</string><string>1</string></entry>
    <entry><string>shipper_id</string><string>8429098020</string></entry>
    <entry><string>scale_weight</string><string>3.01</string></entry>
    <entry><string>bill_weight</string><string>4.0</string></entry>
    <entry><string>package_type</string><string>BOX</string></entry>
    <entry><string>station_id</string><string>308</string></entry>
  </map>
 </dataObject>
</getLabel> 

虽然 XML 中数据的大小不是固定的,但我的最终动机是读取 xml 的“pcsp”数据对象部分中的 package_id 和shipment_id 并存储值“143486104007”和“1”在变量中。

有没有简单的方法可以在 java 中做到这一点,而无需使用任何外部 API/XMLReader ? 如果没有,是否有一个易于使用的外部 API(开源)可以帮助我的事业?

问候 p1nG

最佳答案

您可以尝试使用 XPath,它似​​乎适合您的问题。例如:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true); // never forget this!
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse("a.xml");
XPathFactory xPathFactory = XPathFactory.newInstance();
XPath xpath = xPathFactory.newXPath();
XPathExpression expr = xpath.compile("//dataObject[@name='pcsp']/map/entry/string[text()='shipment_id']/../string[2]/text()");
NodeList result = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
System.out.println(result.item(0).getNodeValue());

打印 143486104007。

对所使用的 xPath 表达式的一些解释:

  • //dataObject[@name='pcsp'] - 从属性名称等于'pcsp'的所有dataObject标签中选择
  • /map/entry - 选择子 map ,然后选择子条目
  • /string[text() = 'shipment_id'] - 选择内部文本等于“shipment_id”的子字符串标签
  • /.. - 选择前一个节点的父节点(在本例中为具有shipment_id 字符串的条目
  • /string[2] - 选择第二个子字符串标签
  • /text() - 选择上一个标签的内部文本 (143486104007)

计算返回与表达式匹配的所有节点的 NodeList(在本例中,仅 1)。

这些类都包含在jdk中。

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

并且您还需要对代码进行一些异常处理。

现在,只有当您需要获得某些标签时,这才有效,这就是我理解您想要的。如果您想读取 xml 中的所有值,那么最好使用 SAX 或 DOM 之类的东西。

关于java - 用Java读取XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3337311/

相关文章:

xml - 使用 R 的 xmlEventParse 存储 XML 节点值以进行过滤输出

Android EditText 在按下回车键时不展开

c# - 什么时候可以使用 XML 文件保存信息?

java - 如何解决 Jersey 错误 服务器遇到意外情况,无法满足请求

c# - XPathSelectElement 中的变量

java - Android - 单击另一个类中的按钮后如何重新启动 MainActivity?

java - SQLite 异常 : no such column in Android

.net - 如何以二进制形式获取节点的值?

java - 将字符设置为 EOF

java - c++ 像 protected in java