تحديث سمة XML في قسم متكرر باستخدام Microsoft.BizTalk.Streaming.ValueMutator
سؤال
أواجه مشكلة حيث أحاول تحديث مجموعة من السمات بقيمة ثابتة مضمنة في قسم متكرر من مستند 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
نأمل أن يكون هذا ساعد.
هتافات،
ديميتري نوفاتشيف