2

同じスキーマ(両方とも有効)に準拠する2つのXMLファイルがある場合、1つには名前空間があり、もう1つには名前空間がありません(サンプル)。

XMLファイル1

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<message xmlns="http://www.somewhere.com/X">
    <messageheader>
    ...
</message>

XMLファイル2

<?xml version="1.0" encoding="UTF-8"?>
<ns1:message xmlns:ns1="http://www.somewhere.com/X">
    <ns1:messageheader>
    ...
</ns1:message>

問題は、ファイルを解析するコードが、テキストコンテンツを抽出して保存する前に、Element.getNodeName()ゲッターを使用してノード名を決定することです。このメソッドは、パフォーマンスのためにXMLを解析するときにXPathではなく使用されました。

したがって、解析を行うために次のサンプルコードが実装されました。

for(int i = 0; i < someElement.getChildNodes().getLength(); i++) {
    if(someElement.getChildNodes().item(i).getNodeType() == org.w3c.dom.Node.ELEMENT_NODE) {
        Element element = (Element) someElement.getChildNodes().item(i);

        if(element.getNodeName().equals("ns1:messageheader")) {
            ...
        }
        ...
    }
}

上記のコードは、XMLファイル2でのみ機能します。

getNodeName()を使用して両方のファイルを解析できるように、ファイルが要素に名前空間プレフィックスを使用しているかどうかを判断することは可能ですか?同じコードを使用して両方のファイルを解析できますか?

これがXMLを解析するためのひどい方法であることに同意します。残念ながら、私のコードは、私が大好きなJAXBに切り替える前に実装されました(今のところ)。

ありがとう

アンデス

4

2 に答える 2

10

getLocalName()の代わりに使用してくださいgetNodeName()。これにより、要素の非修飾名が返されます。

于 2012-12-14T16:23:09.660 に答える
9

これを試して:

if (element.getLocalName().equals("messageheader") &&
    "http://www.somewhere.com/X".equals(element.getNamespaceURI())) { ...

プレフィックスに関係なく、ローカル名と名前空間が一致することを確認する必要があります。

于 2012-12-14T16:27:03.600 に答える