SBAAPIのxmlファイルを使用しようとしています。
http://api.sba.gov/loans_grants/federal_and_state_financing_for/ny.xml
問題は、xpathを使用してこのxmlを解析しようとすると、次のエラーが発生することです。
[致命的なエラー]loans_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
ととの間にスペースがあれば、このエラーは発生しない"103"
と思います。xml全体が大きすぎるため、その一部をコピーして変更を加え、ローカルストレージに保存しました。その後、エラーなしで実行および解析できました。私はちょうどこのようないくつかのスペースを置きます:nil
"true"
<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