デフォルトの名前空間を指定し続けることなくXDocumentを解析します
-
29-10-2019 - |
質問
いくつかのXMLデータ(以下のサンプルと同様)があり、コードで値を読み取りたいです。
各要素にアクセスするためにデフォルトの名前空間を指定する必要があるのはなぜですか?デフォルトの名前空間がすべての要素に使用されることを期待していました。
目標を達成するためのより論理的な方法はありますか?
サンプルXML: ジェネラコディセタグプレ
私が求めているxml要素を読み取るためのコード: ジェネラコディセタグプレ
解決
理論は、ドキュメントの意味は、ユーザーが名前空間プレフィックスを選択しても影響を受けないというものです。データが名前空間
他のヒント
この回答で提案されているように、ドキュメントのメモリ内コピーからすべての名前空間を削除することでこれを行うことができます。これは、結果のドキュメントで名前の衝突が発生しないことがわかっている場合にのみ実行する必要があると思います。 ジェネラコディセタグプレ
を使用できますXmlTextReader.Namespaces プロパティを使用して、XMLファイルの読み取り中に名前空間を無効にします。 ジェネラコディセタグプレ
これがLinq-To-Xmlの仕組みです。デフォルトの名前空間にない場合、要素は見つかりません。その子孫についても同じことが言えます。名前空間を取り除く最も速い方法は、最初のXMLから名前空間へのリンクを削除することです。
要素Receipts
も名前空間http://www.secretsonline.gov.uk/secrets
に含まれているため、要素へのアクセスにはXNamespace
も必要になることに注意してください。
ジェネラコディセタグプレ
名前空間を使用する代わりに、local-name()
とnamespace-uri()
を使用して「名前空間にとらわれない」xpathを使用できることに注意してください。例:
ジェネラコディセタグプレ
namespace-uri
述語を省略した場合:
ジェネラコディセタグプレ
ns1:SomeElement
やns2:SomeElement
などに一致します。IMO可能な場合は常にXNamespace
を使用します。名前空間に依存しないxpathのユースケースは、非常に限られています。スキーマが不明なドキュメント内の特定の要素の解析(サービスバス内など)、または名前空間が変更される可能性のあるドキュメントのベストエフォート解析(たとえば、xmlns
がドキュメントスキーマの新しいバージョンに一致するように変更される将来の保証)