【发布时间】:2015-04-04 15:05:12
【问题描述】:
以下是我的 XML 文件:
<?xml version="1.0" encoding="UTF-8"?>
<query xmlns:yahoo="http://www.yahooapis.com/v1/base.rng" yahoo:lang="en-GB">
<results>
<sector sectorid="1" sectorname="Basic Materials">
<industry id="112" name="Agricultural Chemicals"/>
<industry id="132" name="Aluminum"/>
<industry id="110" name="Chemicals - Major Diversified"/>
<industry id="131" name="Copper"/>
<industry id="134" name="Gold"/>
<industry id="121" name="Independent Oil and Gas"/>
<industry id="120" name="Major Integrated Oil and Gas"/>
</sector>
<sector sectorid="2" sectorname="Conglomerates">
<industry id="210" name="Conglomerates"/>
</sector>
<sector sectorid="7" sectorname="Services">
<industry id="720" name="Advertising Agencies"/>
<industry id="773" name="Air Delivery and Freight Services"/>
<industry id="772" name="Air Services and Others"/>
<industry id="730" name="Apparel Stores"/>
<industry id="744" name="Auto Dealerships"/>
</sector>
</results>
</query>
从上面的 XML 文件中,我希望将属性值:sectorid、id 和 name 存储在适当的变量中(我正在使用 Java)。我一直在查看不同的 XPath 表达式,并想出了以下代码,但是,在存储 id 属性的值时会引发 java.lang.NumberFormatException: For input string: "" 异常。这是我的代码:
public class XMLToDatabase {
private static int __SectorID;
private static int __IndustryID;
private static String __IndustryName;
public static void main(String[] args) throws SQLException, UnsupportedEncodingException, ParserConfigurationException, SAXException, IOException, XPathExpressionException {
try {
File _XMLFile = new File("SectorsAndIndustries.xml");
DocumentBuilderFactory _DocumentBuilderFactory = DocumentBuilderFactory.newInstance();
_DocumentBuilderFactory.setNamespaceAware(true);
DocumentBuilder _DocumentBuilder = _DocumentBuilderFactory.newDocumentBuilder();
Document _Document = _DocumentBuilder.parse(_XMLFile);
_Document.getDocumentElement().normalize();
XPath _XPath = XPathFactory.newInstance().newXPath();
XPathExpression _XPathExpression = _XPath.compile("//sector | //industry");
NodeList _NodeList = (NodeList) _XPathExpression.evaluate(_Document, XPathConstants.NODESET);
for (int i = 0; i < _NodeList.getLength(); i++) {
Node _Node = _NodeList.item(i);
if(_Node.getNodeType() == Node.ELEMENT_NODE) {
Element _Element = (Element) _Node;
__SectorID = Integer.parseInt(_Element.getAttribute("sectorid"));
__IndustryID = Integer.parseInt(_Element.getAttribute("id"));
__IndustryName = _Element.getAttribute("name");
}
System.out.println(__SectorID + ", " + __IndustryID + ", " + __IndustryName);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
有人可以帮我确定是XPath Expression 我犯了错误,还是我存储第二个变量__IndustryID 的方式?因为第一个变量__SectorID 正确存储了值1,但是对于__IndustryID 抛出了上面提到的异常。理想情况下,我希望在每次执行 for 循环时存储所有 3 个属性的值,以将它们保存到数据库表中。如果需要更多信息,请告诉我。
【问题讨论】:
-
这个简单的 XPath 2.0 表达式会产生想要的结果——您只需要了解正在执行的操作并将其转换为 Java 并多次评估 XPath 表达式——对于每个
industry元素://sector/industry/concat(../@sectorid, ' ', @id, ' ', @name, codepoints-to-string((10)))
标签: java xml xpath xml-parsing