Обновите атрибут XML в повторяющемся разделе, используя Microsoft.BizTalk.Streaming.ValueMutator - PullRequest
1 голос
/ 18 ноября 2008

У меня есть проблема, когда я пытаюсь обновить набор атрибутов с фиксированным значением, содержащимся в повторяющемся разделе 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" обновлено неправильно. Желаемый результат - обновить все атрибуты с именем «Тип» значением «Фрукты». Что не так и как эта проблема решается?

Ответы [ 2 ]

2 голосов
/ 18 ноября 2008

Вам необходимо включить альфа-элемент в выражение 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, но на всякий случай есть хорошая информация здесь , здесь и здесь .

Хех - Просто понял, что последний из них - один из моих сотрудников. Маленький мир.

0 голосов
/ 18 ноября 2008

Используемое выражение 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

Надеюсь, это помогло.

Приветствия

Димитр Новатчев

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...