تحديث سمة XML في قسم متكرر باستخدام Microsoft.BizTalk.Streaming.ValueMutator

StackOverflow https://stackoverflow.com/questions/297387

  •  08-07-2019
  •  | 
  •  

سؤال

أواجه مشكلة حيث أحاول تحديث مجموعة من السمات بقيمة ثابتة مضمنة في قسم متكرر من مستند 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" بشكل غير صحيح.والنتيجة المطلوبة هي تحديث كافة السمات المسماة "النوع" بالقيمة "الفاكهة".ما الخطأ الذي يحدث وكيف يتم حل هذه المشكلة؟

هل كانت مفيدة؟

المحلول

وتحتاج إلى تضمين عنصر ألفا في تعبير 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، ولكن فقط في حالة وجود معلومات جيدة <في أ href = "http://martijnh.blogspot.com/2006/03/xpathmutatorstream. أتش تي أم أل "يختلط =" نوفولو noreferrer "> هنا ، <وأ href =" http://bloggingabout.net/blogs/wellink/archive/2006/03/03/11207.aspx "يختلط =" نوفولو noreferrer " > هنا و <لأ href = "http://connectedthoughts.wordpress.com/2008/05/31/updating-repeating-nodes-in-an-xml-document-with-the-same-value- باستخدام-xpathmutatorstream / "يختلط =" نوفولو noreferrer "> هنا .

وهيه - أدرك تماما أن آخر تلك هي واحدة من بلادي زملاء العمل. عالم صغير.

نصائح أخرى

تعبير 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

نأمل أن يكون هذا ساعد.

هتافات،

ديميتري نوفاتشيف

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top