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>

您会注意到“alpha”元素的文本值更新不正确。期望的结果是使用值“Fruit”更新所有名为“Type”的属性。出了什么问题,这个问题是如何解决的?

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]

仅选择具有“类型”属性的元素。

最可能需要的是:

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

希望这有帮助。

干杯,

迪米特·诺瓦切夫

于 2008-11-18T00:15:08.217 回答