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