2017-06-08 15 views
0

に割り当てられませ明示的に指定した名前空間なしXML属性をして、私はこのXML文書を解析しています:はなぜデフォルトの名前空間

<?xml version='1.0' encoding='UTF-8'?> 
<team xmlns='http://www.example.com/default' xmlns:ns1='http://www.example.com/ns1'> 
    <ns1:coach ns1:coachAttr="ABC"/> 
    <player playerAttr="XYZ"/> 
</team> 

私はplayerplayAttrhttp://www.example.com/default名前空間にあることを期待する、coachcoachAttrながら、名前空間がhttp://www.example.com/ns1になります。

となります。playerAttrには名前空間がまったくありません。コードは次のとおりです。

String xml="..."; 
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
factory.setNamespaceAware(true); 
DocumentBuilder builder = factory.newDocumentBuilder(); 
Document doc = builder.parse(new InputSource(new StringReader(xml))); 

Element team = doc.getDocumentElement(); 
Element player = (Element) team.getChildNodes().item(...); 
Element coach = (Element) team.getChildNodes().item(...); 
Attr playerAttr = (Attr) player.getAttributes().item(...); 
Attr coachAttr = (Attr) coach.getAttributes().item(...); 

System.out.println("coach: Name=" + coach.getLocalName() + " NS=" + coach.getNamespaceURI()); 
System.out.println("coachAttr: Name=" + coachAttr.getLocalName() + " NS=" + coachAttr.getNamespaceURI()); 
System.out.println("player: Name=" + player.getLocalName() + " NS=" + player.getNamespaceURI()); 
System.out.println("playerAttr: Name=" + playerAttr.getLocalName() + " NS=" + playerAttr.getNamespaceURI()); 

これは4行を出力します。最初の3つは私にとって理にかなっています。私はNSがnullの最後の行を理解していません。

coach: Name=coach NS=http://www.example.com/ns1 
coachAttr: Name=coachAttr NS=http://www.example.com/ns1 
player: Name=player NS=http://www.example.com/default 
playerAttr: Name=playerAttr NS=null 

なぜplayerAttrは異なる方法で処理されますか?これは何らかの仕様ですか?アイテムに名前空間がないということも意味しますか?

答えて

1

すべてのXMLパーサーは、このように動作します。あなたの質問は「なぜ」なので、これは最も簡単なアプローチであると思います。ここ

詳細: "なぜ?"

https://stackoverflow.com/a/3313538/80911

+0

これは、コード。上記の例では、説明のためにインデックスで子ノードを取得しています。実際にはgetAttributeNS(nsName、attrName)を使用します。 XML文字列がcoachAttrの名前空間接頭辞を使用し、playerAttrの名前空間接頭辞を使用しないことを事前に知る方法はありません。名前空間接頭辞はXMLの意味を変更するものではありません。 – George

+0

簡単な答えは、getAttributeNSではなくgetAttributeを使用することです。名前空間以外の属性はすべて、実際にはその親要素の名前空間の一部であると仮定します。 – Evert

+0

属性abcがデフォルトの名前空間ではなく名前空間ns1に属していることを意味しますか?それは仕様ですか? – George

1

あなたがで正確に何を意味しています。 「この動作はどこに指定されていますか」、または「デザイナーはこの決定に対してどのような理論的根拠を示しましたか」という意味ですか?または「このようにすることでどのような利点がありますか?」

実際には、この上の普遍的コンセンサスがない(これらの質問のどれも...ところで、StackOverflowのに適してません)。 DOMとXPathや他のほとんどのAPIは、このようにそれを行うが、それは言う自体の仕様のXML名前空間によって義務付けられていない:

デフォルトの名前空間宣言が 属性名に直接適用されません。接頭辞のない属性の解釈は、表示される要素である によって決定されます。

私はそれが意味すると思われるものについて多くの理論を聞いてきましたが、理論のどれも具体的なAPIに特によく翻訳されていません。

実際には、使用しているAPIのスペック(この場合はDOM)を調べる必要があります。 (StackOverflow上のJava/XMLユーザーの99%は、JDOM2やXOMなどのより優れた選択肢があるため、非常にうっかりと感じるDOMを使用しているように見えます)