1

を使用して、XML ドキュメントの繰り返しセクション内に含まれる固定値で一連の属性を更新しようとすると問題が発生しますMicrosoft.BizTalk.Streaming.ValueMutator

たとえば、更新しようとしている XML ドキュメントには、次の入力が含まれています。

<ns0:TestXML xmlns:ns0="http://Test.Schemas">
   <ns0:NodeA>
      <ns0:NodeB>
         <ns0:alpha Id="1" Value="Apple" Type=""></ns0:alpha>
         <ns0:alpha Id="2" Value="Banana" Type=""></ns0:alpha>
         <ns0:alpha Id="3" Value="Car" Type=""></ns0:alpha>
         <ns0:alpha Id="4" Value="Duck" Type=""></ns0:alpha>
      </ns0:NodeB>
   </ns0:NodeA>
</ns0:TestXML>

XML ドキュメントを更新するために使用しようとしているコードは次のとおりです。

XmlDocument xDocInput = new XmlDocument();
XmlDocument xDocOutput = new XmlDocument();
string inputFileName = @"C:\Input.xml";
string outputFileName = @"C:\Output.xml";
string newValue = "fruit";
string xpathToUpdate = "/*[namespace-uri()='http://Test.Schemas']/*[local-name()='NodeA']/*[local-name()='NodeB']/*[@Type]";

xDocInput.Load(inputFileName);

using (MemoryStream memstream = new MemoryStream())
{

    xDocInput.Save(memstream);
    memstream.Position = 0;

    XPathCollection queries = new XPathCollection();
    queries.Add(new XPathExpression(xpathToUpdate));
    //ValueMutator xpathMatcher = new ValueMutator(this.XPathCallBack);

    //Get resulting stream into response xml
    xDocOutput.Load(new XPathMutatorStream(memstream, queries, delegate(int matchIdx, XPathExpression expr, string origValue, ref string finalValue) { finalValue = newValue; }));
    //System.Diagnostics.Trace.WriteLine("Trace: " + memstream.Length.ToString());
}

xDocOutput.Save(outputFileName);

このコードの結果の出力は、ファイル「Output.xml」です。出力ドキュメント「Output.xml」には、次の出力が含まれています。

<ns0:TestXML xmlns:ns0="http://Test.Schemas" >
   <ns0:NodeA>
      <ns0:NodeB>
         <ns0:alpha Id="1"  Value="Apple"  Type="" >fruit</ns0:alpha>
         <ns0:alpha Id="2"  Value="Banana"  Type="" >fruit</ns0:alpha>
         <ns0:alpha Id="3"  Value="Child"  Type="" >fruit</ns0:alpha>
         <ns0:alpha Id="4"  Value="Duck"  Type="" >fruit</ns0:alpha>
      </ns0:NodeB>
   </ns0:NodeA>
</ns0:TestXML>

「アルファ」要素のテキスト値が正しく更新されていないことに気付くでしょう。望ましい結果は、「Type」という名前のすべての属性を値「Fruit」で更新することです。何がうまくいかず、この問題はどのように解決されますか?

4

2 に答える 2

2

XPath式にalpha要素を含める必要があります。

以下の式を使用してコードを実行しました。

string xpathToUpdate = "/*[namespace-uri()='http://Test.Schemas']/*[local-name()='NodeA']/*[local-name()='NodeB']/*[local-name()='alpha']/@Type";

次のXMLを取得しました

<ns0:TestXML xmlns:ns0="http://Test.Schemas">
  <ns0:NodeA>
    <ns0:NodeB>
      <ns0:alpha Id="1" Value="Apple" Type="fruit">
      </ns0:alpha>
      <ns0:alpha Id="2" Value="Banana" Type="fruit">
      </ns0:alpha>
      <ns0:alpha Id="3" Value="Car" Type="fruit">
      </ns0:alpha>
      <ns0:alpha Id="4" Value="Duck" Type="fruit">
      </ns0:alpha>
    </ns0:NodeB>
  </ns0:NodeA>
</ns0:TestXML>

あなたが投稿したコードを見ると、ValueMutatorの使用に関するこれらの記事を見たことがあるでしょうが、念のため、ここここ、ここに良い情報があります

えー、最後は私の同僚の一人だと気づきました。小さな世界。

于 2008-11-18T06:13:26.930 に答える
0

使用される XPath 式:

   //namespace-uri()='http://Test.Schemas']/*[local-name()='NodeA']/*[local-name()='NodeB']/*[@Type]

「Type」属性を持つ要素のみを選択します。

おそらく必要なものは次のとおりです。

   /*[namespace-uri()='http://Test.Schemas']/*[local-name()='NodeA']/*[local-name()='NodeB']/@Type

これが役に立ったことを願っています。

乾杯、

ディミトレ・ノヴァチェフ

于 2008-11-18T00:15:08.217 に答える