Microsoft.BizTalk.Streaming.ValueMutatorを使用して繰り返しセクションのXML属性を更新する
質問
Microsoft.BizTalk.Streaming.ValueMutator
を使用して、XMLドキュメントの繰り返しセクション内に含まれる固定値で属性セットを更新しようとすると問題が発生します。
たとえば、更新しようとしている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);
このコードの結果の出力は、ファイル&quot; Output.xml&quot;です。出力ドキュメント内に含まれる&quot; Output.xml&quot;次の出力です。
<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>
お気づきのとおり、「アルファ」要素のテキスト値が正しく更新されません。望ましい結果は、&quot; Type&quot;という名前のすべての属性を更新することです。値は「果物」です。何がうまくいかず、この問題はどのように解決されますか?
解決
XPath式にアルファ要素を含める必要があります。
次の式を使用してコードを実行しました:
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の使用に関するこれらの記事を見たことがあるでしょうが、念のためこちら、こちらおよびこちら。
へー-最後の人が私の同僚の一人だということに気づきました。小さな世界。
他のヒント
使用されるXPath式:
&nbsp;&nbsp;&nbsp; // namespace-uri()= 'http://Test.Schemas'] / * [local-name()= 'NodeA'] / * [local -name()= 'NodeB'] / * [@ Type]
&quot; Type&quot;がある要素のみを選択します。属性。
ほとんどの場合、必要なのは次のとおりです:
&nbsp;&nbsp;&nbsp; / * [namespace-uri()= 'http://Test.Schemas'] / * [local-name()= 'NodeA'] / * [ local-name()= 'NodeB'] / @ Type
これがお役に立てば幸いです。
乾杯、
ディミトレ・ノヴァチェフ