0

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
4

1 に答える 1

1

XML ではありません。これは、DTDがジャッキアップされていることを示しています。loans_grants.dtd:3:22エラーの先頭にある に注意してください。3行目を指しています:

<!ATTLIST count CDATA>

おそらく代わりに読むべきです

<!ATTLIST grant_loans count CDATA #REQUIRED>

エラーは、 anの適切な形式ATTLISTが次のとおりであることを指摘しています。

<!ATTLIST element-name attribute-name attribute-type default-value>

3 番目の位置に文字列 "CDATA" があり、それが属性名であると想定し、属性タイプを取得することを期待していましたが、代わりに . の終わりを見つけましたATTLIST。そのため、空白を期待することについて混乱を招く可能性のあるメッセージが表示されました。

ほとんどの場合、xml の一部をローカルで実行するためにコピーしたときに、DTD 宣言を省略したため、問題も解決しました。

于 2013-02-14T01:10:46.053 に答える