我遇到一个问题,我试图使用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);
此代码的结果输出是文件“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>
您会注意到“alpha”元素的文本值更新不正确。所需的结果是使用值“Fruit”更新名为“Type”的所有属性。出了什么问题,这个问题是如何解决的?
答案 0 :(得分: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的这些文章,但以防万一有好信息here,here和here。
嘿 - 刚刚意识到最后一个是我的同事之一。小世界。答案 1 :(得分:0)
使用的XPath表达式:
<强> //namespace-uri()='http://Test.Schemas']/*[local-name()='NodeA']/*[local-name()='NodeB']/*[@Type]
强>
仅选择具有“类型”属性的元素。
最有可能的是:
<强> /*[namespace-uri()='http://Test.Schemas']/*[local-name()='NodeA']/*[local-name()='NodeB']/@Type
强>
希望这会有所帮助。
干杯,
Dimitre Novatchev