デフォルトの名前空間を指定し続けることなくXDocumentを解析します

StackOverflow https://stackoverflow.com/questions/7387058

質問

いくつかのXMLデータ(以下のサンプルと同様)があり、コードで値を読み取りたいです。

各要素にアクセスするためにデフォルトの名前空間を指定する必要があるのはなぜですか?デフォルトの名前空間がすべての要素に使用されることを期待していました。

目標を達成するためのより論理的な方法はありますか?

サンプルXML: ジェネラコディセタグプレ

私が求めているxml要素を読み取るためのコード: ジェネラコディセタグプレ

役に立ちましたか?

解決

理論は、ドキュメントの意味は、ユーザーが名前空間プレフィックスを選択しても影響を受けないというものです。データが名前空間 http://www.secretsonline.gov.uk/secrets、作成者がプレフィックス「s」、「secrets」、「_ x.cafe.babe」、または「null」プレフィックスのいずれを使用するか(つまり、デフォルトの名前空間にするか)は関係ありません。アプリケーションは気にしないでください。重要なのはURIだけです。そのため、アプリケーションでURIを指定する必要があります。

他のヒント

この回答で提案されているように、ドキュメントのメモリ内コピーからすべての名前空間を削除することでこれを行うことができます。これは、結果のドキュメントで名前の衝突が発生しないことがわかっている場合にのみ実行する必要があると思います。 ジェネラコディセタグプレ

を使用できますXmlTextReader.Namespaces プロパティを使用して、XMLファイルの読み取り中に名前空間を無効にします。 ジェネラコディセタグプレ

これがLinq-To-Xmlの仕組みです。デフォルトの名前空間にない場合、要素は見つかりません。その子孫についても同じことが言えます。名前空間を取り除く最も速い方法は、最初のXMLから名前空間へのリンクを削除することです。

要素Receiptsも名前空間http://www.secretsonline.gov.uk/secretsに含まれているため、要素へのアクセスにはXNamespaceも必要になることに注意してください。 ジェネラコディセタグプレ

名前空間を使用する代わりに、local-name()namespace-uri()を使用して「名前空間にとらわれない」xpathを使用できることに注意してください。例: ジェネラコディセタグプレ

namespace-uri述語を省略した場合: ジェネラコディセタグプレ

ns1:SomeElementns2:SomeElementなどに一致します。IMO可能な場合は常にXNamespaceを使用します。名前空間に依存しないxpathのユースケースは、非常に限られています。スキーマが不明なドキュメント内の特定の要素の解析(サービスバス内など)、または名前空間が変更される可能性のあるドキュメントのベストエフォート解析(たとえば、xmlnsがドキュメントスキーマの新しいバージョンに一致するように変更される将来の保証)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top