2008-11-17 7 views
1

J'ai un problème lorsque j'essaie de mettre à jour un ensemble d'attributs avec une valeur fixe contenue dans une section récurrente d'un document XML à l'aide du Microsoft.BizTalk.Streaming.ValueMutator.Mettre à jour l'attribut XML dans une section récurrente à l'aide de Microsoft.BizTalk.Streaming.ValueMutator

Par exemple, le document XML que je tente de mettre à jour contient l'entrée suivante:

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

Le code que je tente d'utiliser pour mettre à jour le document XML est:

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); 

Le Le résultat de ce code est le fichier "Output.xml". Figurant dans le document de sortie « Output.xml » est la sortie suivante:

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

Comme vous remarquerez la valeur du texte de l'élément « alpha » est mis à jour correctement. Le résultat souhaité est de mettre à jour tous les attributs nommés "Type" avec la valeur "Fruit". Qu'est-ce qui ne va pas et comment ce problème est-il résolu?

Répondre

2

Vous devez inclure l'élément alpha dans votre expression XPath.

j'ai couru votre code en utilisant l'expression ci-dessous:

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

et a obtenu le 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> 

suivant regardant le code affiché, vous avez probablement vu ces articles sur l'utilisation du ValueMutator, mais juste au cas où il y a de bonnes informations here, here et here. Heh - Je viens de réaliser que le dernier de ceux-là est un de mes collègues. Petit monde.

+0

Nice. Je n'avais pas réalisé que c'était quelque chose de si élémentaire. Merci de préserver ma santé mentale. – chinna

0

L'expression XPath utilisée:

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

sélectionne uniquement les LÉMENTS qui ont un attribut "Type".

Très probablement ce qui est nécessaire est:

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

Hope this aidé.

Cheers,

Dimitre Novatchev

+0

édité la réponse - les astérisques dans l'expression XPath ne montraient pas, parce qu'ils étaient dans un champ gras (** ... **). S'il vous plaît, essayez encore. - Dimitre Novatchev (il y a 0 secondes) –

+0

Vous avez modifié les résultats de la réponse en n'apportant aucune modification au document en entrée. – chinna

+0

Je ne connais pas BizTalk Server et je ne sais pas ce que fait la classe XPathMutatorStream. Peut-être que les mises à jour peuvent être effectuées uniquement sur des éléments? Que dit la documentation?Si vous pouvez m'envoyer une référence aux docs et un exemple de code de travail très simple, je peux y jeter un coup d'œil. –

Questions connexes