に割り当てられませ明示的に指定した名前空間なし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>
私はplayer
とplayAttr
がhttp://www.example.com/default
名前空間にあることを期待する、coach
とcoachAttr
ながら、名前空間が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
は異なる方法で処理されますか?これは何らかの仕様ですか?アイテムに名前空間がないということも意味しますか?
これは、コード。上記の例では、説明のためにインデックスで子ノードを取得しています。実際にはgetAttributeNS(nsName、attrName)を使用します。 XML文字列がcoachAttrの名前空間接頭辞を使用し、playerAttrの名前空間接頭辞を使用しないことを事前に知る方法はありません。名前空間接頭辞はXMLの意味を変更するものではありません。 – George
簡単な答えは、getAttributeNSではなくgetAttributeを使用することです。名前空間以外の属性はすべて、実際にはその親要素の名前空間の一部であると仮定します。 – Evert