我正在尝试使用来自 SBA api 的 xml 文件。
http://api.sba.gov/loans_grants/federal_and_state_financing_for/ny.xml
问题是当我尝试用 xpath 解析这个 xml 时,我得到了这个错误:
[致命错误] loan_grants.dtd:3:22:元素“count”的属性“CDATA”声明中的属性类型之前需要空格。线程“main”org.xml.sax.SAXParseException 中的异常:元素“count”的属性“CDATA”声明中的属性类型之前需要空格。
观察 xml 文件后,我认为问题出在以下几行和之后的类似行中:
<grant_loans count="103">
<industry nil="true"/>
<state_name nil="true"/>
count
我认为如果and"103"
和nil
and之间有空格,"true"
那么这个错误就不会发生。由于整个 xml 太大,我复制了其中的一部分并进行了这些更改并保存在我的本地存储中。然后我可以运行并解析它而不会出错。我只是放了一些这样的空格:
<grant_loans count = "103">
如何使用我的程序对所有需要空间的地方执行此操作,然后将其用于进一步解析?
如果您需要,我可以在这里发布我的 java 代码,但该代码适用于其他 xml 文件,所以我认为这个 xml 文件有问题。
编辑
Java代码段:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder builder;
Document doc = null;
XPathExpression expr = null;
builder = factory.newDocumentBuilder();
doc = (Document) builder
.parse("http://maps.googleapis.com/maps/api/geocode/xml?address=1600+Amphitheatre+Parkway&sensor=false");
// Create a XPathFactory
XPathFactory xFactory = XPathFactory.newInstance();
// Create a XPath object
XPath xpath = xFactory.newXPath();
// Compile the XPath expression
expr = xpath.compile("//geometry/location/lat/text()");
System.out.println("expr" + expr);
// Run the query and get a nodeset
Object result = expr.evaluate(doc, XPathConstants.NODESET);
// Cast the result to a DOM NodeList
NodeList nodes = (NodeList) result;
for (int i = 0; i < nodes.getLength(); i++) {
System.out.println(nodes.item(i).getNodeValue());
}
//this works
//
// some other code
//
builder = factory.newDocumentBuilder();
url = "http://api.sba.gov/loans_grants/federal_and_state_financing_for/ny.xml";
doc = builder.parse(url); // problem occurs here
xFactory = XPathFactory.newInstance();
// Create a XPath object
xpath = xFactory.newXPath();
// Compile the XPath expression
expr = xpath.compile("//grant_loan/url/text()");
result = expr.evaluate(doc, XPathConstants.NODESET);
// Cast the result to a DOM NodeList
nodes = (NodeList) result;
for (int i = 0; i < nodes.getLength(); i++) {
System.out.println(nodes.item(i).getNodeValue());
}
//other stuffs