2

パートナー企業から受け取った比較的複雑な xml メッセージがあります。それを使用するには、xml を解析する必要があります。私はそれを正常に動作させましたが、その後、メッセージが全体的に変更され、SelectSingleNode コマンドが機能しなくなりました。

メッセージの構造。xml ドキュメントが埋め込まれた CDATA オブジェクトに注意してください。これが重要かどうかはわかりません。dataContent オブジェクトをピンセットで取り出すことができたので、違いはありません。XmlDocument に読み込んでいるものは次のとおりです。

<ns5:dataContent xmlns:ns2="http://test/common/v1" 
                     xmlns="http://test/schema/common" 
                     xmlns:ns4="http://test/credentialing/stuff/v1" 
                     xmlns:ns3="http://test/schema/ims/common/v1" 
                     xmlns:ns5="http://test/schema/v1">

        <createdBy>Micky</createdBy>
        <createdAt>2011-03-08T17:00:27.050-05:00</createdAt>
        <ns5:Id>39</ns5:Id>
        <ns5:Type>4</ns5:Type>
     -- lots more data --
</ns5:dataContent>

私のコードはかなり簡単です

   var xmlDoc = new XmlDocument();
   xmlDoc.Load(new StringReader(CDATA content));
   var xmlNsM = new XmlNamespaceManager(xmlData.NameTable);
   xmlNsM.AddNamespace(String.Empty, @"http://test/schema/common\");
   xmlNsM.AddNamespace("ns5", @"http://test/schema/v1\");
   xmlNsM.AddNamespace("m", @"http://test/message/v1\");

//This works
   var order = xmlDoc.ChildNodes[0];

//This returns null
   var ID = order.SelectSingleNode("ns5:Id", xmlNsM);

xmlDoc が正しく読み込まれていることがわかります。6 つの名前空間すべてを xmlNsM に追加しようとしましたが、同じ結果が得られました。私の SelectSingleNodes はどれも今は機能しません。

この件に関して私が見つけたすべての投稿は、名前空間マネージャーを使用するように言っていますが、私はすでにそれを知っていたので、あまり生産的な午後ではありませんでした.

4

3 に答える 3

2

コードを読むだけで、Namespace Manager を正しく使用していると思います。問題は XPath クエリです。「ns5:Id」は上位レベルのドキュメントの子ではなく、ChildNodes は 1 レベル下のみを返します。被相続人を探す必要があります。試す:

var root = doc.DocumentElement;
var ID = root.SelectSingleNode("//ns5:Id", xmlNsM); 

これは、ドキュメント全体ですべての一致を見つけるため、最も効率的ではありません。ここでいくつかの例を見てみましょう: http://msdn.microsoft.com/en-us/library/ms256086.aspx

于 2011-03-10T01:29:19.320 に答える
1

何時間も何時間も問題を調べた後によくあることですが、解決策は簡単でした。NSManager に追加した名前空間には、終了引用符 ("http://test/schema/v1\") の前にスラッシュがありました。もちろんこれは区切り文字ですが、生の xml から名前空間をコピーして貼り付けただけなので、含まれていました。それらを削除すると、ns5 名前空間で必要なすべてのフィールドが見つかり始めました。

何らかの理由で名前空間を持たない要素が表示されませんが、それらのフィールド ATM は必要ないため、後で調べます。

于 2011-03-10T16:49:28.723 に答える
0

@ErnieLの答えは良さそうです(+1)。問題がある可能性もあります

  xmlNsM.AddNamespace(String.Empty, @"http://test/schema/common\");

xpathはデフォルトの名前空間が好きではないため:-(。@ErnieLの回答がまだ機能しない場合は、次のように変更します

  xmlNsM.AddNamespace("default", @"http://test/schema/common\");
于 2011-03-10T07:34:45.270 に答える