2

XML 名前空間エイリアスが不明な XML ドキュメントを読み取り/解析するにはどうすればよいですか? XML ドキュメントの構造と名前空間はわかっていますが、エイリアスはわかっていません。例えば

<?xml version="1.0" encoding="utf-8"?>
<Order xmlns:aa="urn:namespace1"
       xmlns:bb="urn:namespace2">
  <aa:Quantity>1</aa:Quantity>
  <bb:Price>9.98</bb:Price>
</Order>

または

<?xml version="1.0" encoding="utf-8"?>
<Order xmlns:cc="urn:namespace1"
       xmlns:dd="urn:namespace2">
  <cc:Quantity>1</cc:Quantity>
  <dd:Price>9.98</dd:Price>
</Order>

更新: XML 名前空間のエイリアスが事前にわかりません。それらは何でもかまいません。

次のように、XmlNamespaceManager に名前空間のリストとエイリアスを AddNameSpace メソッドで指定する必要があります。

XPathDocument xDoc = new XPathDocument(“Path to my file”); 
XPathNavigator xNav = xDoc.CreateNavigator();
XmlNamespaceManager xmlns = new XmlNamespaceManager(xNav.NameTable);
xmlns.AddNamespace("aa", "urn:namespace1");
xmlns.AddNamespace("bb", "urn:namespace2");

しかし、これは XML 名前空間にとらわれません。2 番目のドキュメントでは、cc と dd を同じ名前空間のエイリアスとして使用しています。

4

2 に答える 2

3

あなたが提供したコード、ソース XML で使用される名前空間プレフィックスが重要ではないという意味で、名前空間に依存しません。質問の名前空間定義を考えると、XPATH で定義したプレフィックスを使用する必要があります。たとえば、 and を使用する必要がaaありbbます。

var quantity = xNav.SelectSingleNode("/Order/aa:Quantity", xmlns);

ただし、このコードは、名前空間およびが正しく使用されている限り、プレフィックスccおよびが使用されている XML から正常に選択されます。ddurn:namespace1urn:namespace2

XPATH に名前空間プレフィックスを含めることができるようにするには、IXmlNamespaceResolver.

繰り返します: 次のコードを使用して名前空間を定義する場合

xmlns.AddNamespace("aa", "urn:namespace1");

あなたのコード (たとえば、使用する予定の XPATH 内) で、 namespace に名前空間プレフィックスaaを使用すると述べていますurn:namespace1

解析する XML では、属性を使用して名前空間を割り当てます。

xmlns:cc="urn:namespace1"

urn:namespace1その特定の名前空間を使用するには、文字列が両方の場所に一致することが重要です。プレフィックスはコードと XML ファイルに対してそれぞれローカルであり、一致する必要はありません。

于 2012-10-15T10:03:15.113 に答える
0

ドキュメントで使用される名前空間エイリアスは重要ではありません。それらはドキュメントで使用される単なるエイリアスであり、そのドキュメントの作成者がそのドキュメントを作成するときに使用したいものであれば何でもかまいません (ドキュメントの途中で変更することもできます)。

エイリアスに依存しない方法でこのドキュメントにアクセスするにはXmlNamespaceManager、使用するエイリアスを に提供し、そのエイリアスを使用してドキュメントにアクセスします。たとえば、

XmlNamespaceManager xmlns = new XmlNamespaceManager(xNav.NameTable);
xmlns.AddNamespace("foo", "urn:namespace1");
xmlns.AddNamespace("bar", "urn:namespace2");

これらのエイリアスは、ドキュメントで使用されているものと一致する必要はありません。fooこれにより、ドキュメント自体で使用されているエイリアスに関係なく、これらの名前空間のおよびエイリアスを使用して XPath 式を使用しbarてドキュメントをナビゲートできます (それを提供する限り)。のインスタンスXmlNamespaceManager)。

于 2012-10-15T10:15:04.910 に答える