Microsoft.biztalk.streaming.valuemutator를 사용하여 반복 섹션에서 XML 속성을 업데이트하십시오

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

  •  08-07-2019
  •  | 
  •  

문제

나는 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>

알다시피 "알파"요소의 텍스트 값이 잘못 업데이트됩니다. 원하는 결과는 "type"이라는 모든 속성을 "과일"값으로 업데이트하는 것입니다. 무엇이 잘못 되고이 문제가 어떻게 해결됩니까?

도움이 되었습니까?

해결책

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 사용에 관한이 기사를 보았을 것입니다. 여기, 여기 그리고 여기.

Heh- 그 중 마지막이 내 동료 중 하나라는 것을 깨달았습니다. 작은 세상.

다른 팁

사용 된 xpath 표현식 :

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

"type"속성이있는 리멘트 만 선택합니다.

아마도 아마도 필요한 것은 다음과 같습니다.

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

이것이 도움이 되었기를 바랍니다.

건배,

Dimitre Novatchev

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top