私はXSDを持っているいくつかのXMLコンテンツを解析する必要があります。一般的に、これは簡単です。しかし、ある特定のケースでは、XMLにはXML名前空間が含まれることがあり、そうでない場合もあります。さらに、提供されるXMLは複数のソースから来るため、XML名前空間を要求するのは実際的ではありません。だから私はこれを回避しようとしている。名前空間がある場合とない場合があるXMLコンテンツを解析するにはどうすればよいですか?
私はXML用のXSDを持っており、XSD(対応するXMLエンティティクラス)をXSDから生成するためにXJC(JAXB製)を使用しました。名前空間を含む
サンプルXML:
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="http://www.w3.org/namespace/">
<foo id="123>
<bar>value</bar>
</foo>
</root>
名前空間を除いたサンプルXML:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<foo id="123>
<bar>value</bar>
</foo>
</root>
あなたが見ることができるように、XMLコンテンツは構造が同じである - 唯一の違いはxmlxs
属性ですエンティティのroot
にあります。
URI uri = <URI of XML file>
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
Node node = builder.parse(uri.toString()); // Parsing succeeds, ie. the XML is valid.
JAXBContext context = JAXBContext.newInstance("com.example.xml");
Unmarshaller parser = context.createUnmarshaller();
// Next line succeeds or fails, depending on presence of namespace
Object object = parser.unmarshal(node);
XMLは、常に成功しNode
に解析され、次のよう
私のコードです。 xmlns
属性がXMLに存在する場合、プロセス全体が正常に完了し、com.example.xml.Root
クラス(XJCを使用して生成されたクラス)のインスタンスが受信されます。そこから私はFoo
とBar
のオブジェクトにアクセスできます。
xmlns
属性が存在しない場合は、アンマーシャリングとは、次の例外で失敗します。私は限られた成功を収めてunmarmshalling by declared typeを試してみました
javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"root").
Expected elements are <{http://www.w3.org/namespace/}root>,
<{http://www.w3.org/namespace/}foo>,
<{http://www.w3.org/namespace/}bar>
。特に、アンマーシャリングはエラーなく完了しました。しかし、得られたRoot
クラスには、Foo
またはBar
オブジェクトは含まれていませんでした。
このためのコードがする最後の行を変更する必要:
Object object = parser.unmarshal(node, Root.class);
私はfalse
に設定された「空間認識」フラグを非整列化しようとしたが、これはエラーで失敗しました。
アンマーシャリングする前に、node
に名前空間を追加することを考えました。しかし、APIはこれを許可していないようです。
私が持っていたもう一つの考えは、それぞれのケース(すなわち名前空間、名前空間なし)ごとに1つずつ、2組の生成クラスを持つことでした。しかし、これはあまりにも多くのクルージュのようです。
だから私は立ち往生していますか?助言がありますか?それとも私が不可能なことをしようとしているのですか?
Tあなたのソリューションをまとめるための時間をとっておいてください。私はできる限り私の環境でそれを複製しましたが、私にとってはうまくいかないのです。私の名前空間フィルタが使用されていますが、 'super.startElement(" "、...);が呼び出されたとき、私の質問に記録されている' Root'と同じ 'UnmarshalException'を取得します。私は運がないとしばらくそれをデバッグしてきました。 – dave
@dave私はあなたのサンプルxmlを貼り付けてこれをテストしました。違うxmlがありますか? – Optional
あなたのソリューションは機能していましたので、私は何かばかなことをする必要があります。私はそれで寝て、その違いを見直しました。私は 'String'ではなく' URI'で始めましたが、私はそれを回避することができました。それは注釈付きのPOJOを残しました。あなたのものは手作業でコーディングされ、鉱山が生成されました。そして、それが私に当たった、私はXSDから生成されたクラスを使用していた。結局のところ、私たちはXMLから名前空間を取り除いているので、クラスもそれを持たないべきです。生成されたクラスの正しいセットに切り替えた後、すべて正常に機能しました。再度、感謝します。 – dave