0

からデータを抽出しようとしていXML file via XPathます。私のコードはXML名前空間なしで動作しますが、私のコードには名前空間があるため、必要なNamespaceContextものをXPathオブジェクトに追加しました。残念ながら、XPathはデータを配信しなかったため、いじくり回した後、コードは変更されませんでしたが、このjarファイルが xmlparserv2.jar クラスパスに追加されました。そして出来上がり、突然すべてが完璧に機能します。

jarには、すでにJDK(1.7.0_15)にあるが、おそらく異なるバージョンのクラスが含まれていることがわかります。

だから私の質問は

JDKa)エンドレスでデバッグしなければならないこと以外に、元のクラスの何が問題になっているのかを知る方法はありclassesますか?

b)別の解決策/追加の「不要な」ものを出荷する必要がないようにコードを変更する方法について誰かが考えていjarますか?

ありがとうサイモン

それが問題のコードです:

public class JavaApplication1 {

public static void main(String[] args) throws IOException, SAXException {
    Document doc = createDoc("Persons.xml");
    parseSFMessage(doc);
}

private static void parseSFMessage(Node node) {
    if (node.getNodeName().startsWith("Persons:person") && node.hasChildNodes()) {
        print("PLZ: " + getNodeValue(node, "ns1:PLZ"));
    }
    NodeList nodeList = node.getChildNodes();
    for (int i = 0; i < nodeList.getLength(); i++) {
        Node currentNode = nodeList.item(i);
        if (currentNode.getNodeType() == Node.ELEMENT_NODE) {
            parseSFMessage(currentNode);
        }
    }
}

private static Document createDoc(String s) {
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = null;
    Document doc = null;
    try {
        builder = factory.newDocumentBuilder();
        doc = builder.parse(new FileInputStream(s));
    } catch (SAXException e) {
    } catch (IOException e) {
    } catch (ParserConfigurationException e) {
    }
    return doc;
}

private static String getNodeValue(Node dom, String element) {
    NamespaceContext ctx = new NamespaceContext() {
        public String getNamespaceURI(String prefix) {
            String uri;
            if (prefix.equals("ns1")) {
                uri = "http://someurl.com/schemas/class/Utils";
            } else {
                uri = null;
            }
            return uri;
        }
        public Iterator getPrefixes(String val) {
            return null;
        }
        public String getPrefix(String uri) {
            return null;
        }
    };
    String result = null;
    XPathFactory xpf = XPathFactory.newInstance();
    XPath xp = xpf.newXPath();
    xp.setNamespaceContext(ctx);
    try {
        result = xp.evaluate(element, dom);
    } catch (XPathExpressionException e) {
        e.printStackTrace();
    }
    return result;
}

private static void print(Object o) {
    if (o != null) {
        System.out.println(o.toString());
    }
}
}
4

1 に答える 1

1

DocumentBuilderFactoryデフォルトでは名前空間を認識しないことに注意する必要があります。名前空間をサポートしてXMLを適切に解析するビルダーを取得するには、呼び出すfactory.setNamespaceAware(true);前に呼び出す必要があります。factory.newDocumentBuilder()

なぜそれが機能したのかについてはxmlparserv2、おそらくその特定のパーサーがJAXP仕様に反し、デフォルトで名前空間を有効にしていると推測することしかできません。

于 2013-02-23T17:56:23.883 に答える