JSR-173 仕様 (Stax API for Java) は、NAMESPACE イベントに関して次のように述べています。
名前空間 名前
空間の宣言は、StartElement の外にも存在でき、スタンドアロンの情報項目として報告される場合があります。一般に、名前空間は StartElement イベントの一部として報告されます。名前空間が XQuery または XPath 式の結果である場合、スタンドアロン イベントとして報告されることがあります。
したがって、名前空間のイベントを見ている場合は、おそらくStartElement
イベントをチェックして検査する必要があります。もう一度、仕様から:
名前空間には、次のメソッドを使用してアクセスできます。
int getNamespaceCount();
String getNamespacePrefix(int インデックス);
文字列 getNamespaceURI(int インデックス);
現在の StartElement で宣言されている名前空間のみを使用できます。このリストには、以前に宣言された名前空間は含まれず、再宣言された名前空間は削除されません。
解析中の任意の時点で、現在の完全な名前空間コンテキストを取得できます。
現在の状態のネームスペース コンテキストは、
XMLStreamReader.getNamespaceContext()
または
を呼び出すことで利用できますStartElement.getNamespaceContext()
。これらのメソッドは、インターフェイスのインスタンスを返し
javax.xml.namespace.NamespaceContext
ます。
それは理論です。ほとんどの名前空間宣言は START_ELEMENT から来ており、いくつかは独立して来ているかもしれません。
実際には、ファイルからの読み取り時に API によって報告された NAMESPACE イベントに出くわしたことはありません。ほとんどの場合、START_ELEMENT の一部として報告されます (対応する END_ELEMENT で繰り返されます)。そのため、名前空間の宣言に関心がある場合は、START_ELEMENT を確認する必要があります。たとえば、ドキュメントから始めます:
String xml = "<?xml version=\"1.0\" encoding=\"utf-8\" ?><mySample xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" attribute1=\"value1\"/>";
XMLStreamReader reader = XMLInputFactory.newFactory().createXMLStreamReader(new StringReader(xml));
while (reader.hasNext()) {
int event = reader.next();
if (XMLStreamConstants.START_ELEMENT == event) {
if (reader.getNamespaceCount() > 0) {
// This happens
System.out.println("ELEMENT START: " + reader.getLocalName() + " , namespace count is: " + reader.getNamespaceCount());
for (int nsIndex = 0; nsIndex < reader.getNamespaceCount(); nsIndex++) {
String nsPrefix = reader.getNamespacePrefix(nsIndex);
String nsId = reader.getNamespaceURI(nsIndex);
System.out.println("\tNamepsace prefix: " + nsPrefix + " associated with URI " + nsId);
}
}
} else if(XMLStreamConstants.NAMESPACE == event) {
// This almost never happens
System.out.println("NAMESPACE EVENT");
}
}
生産します:
要素の開始: mySample 、名前空間の数: 1
Namepsace プレフィックス: URI http://www.w3.org/2001/XMLSchema-instanceに関連付けられた xsi
結論 : NAMESPACE および START_ELEMENT イベントを確認する必要があります。ほとんどの場合、START_ELEMENT レポートの名前空間宣言しかない場合でも、どちらか一方ではなく、両方です。