2009-08-20 11 views
0

Ma question est comment définir des valeurs à deux attributs qui ont le même nom mais des espaces de noms différents. En utilisant C#, dans un document XML, j'ai besoin d'assigner deux attributs à un élément. Il devrait ressembler àespaces de noms XML explicites et implicites

doc xmlns: XMI = "uriaddress" élément xsi: type = "xsitype1" type = "type1"

J'ai essayé

xElement.SetAttribute ("type", "uriaddress", "xsitype1")

cela fonctionne très bien!

cependant, ma surprise est que lorsque j'ai essayé de régler le second attribut, "type", par

xElement.SetAttribute ("type", "type1")

cela fonctionne, mais aussi réinitialise l'attribut xmi: type à la même valeur que l'attribut "type", en changeant l'élément de manière non intentionnelle.

Maintenant, l'élément ressemble

élément xsi: type = "type1" type = "type1"

Toute façon de contourner cela?

Répondre

0

Il me semble que vous avez mis le mauvais espace de noms dans le premier appel SetAttribute. Cet espace de nom doit être l'espace de noms pour le préfixe xsi, pas pour le préfixe XMI ...

Vous pouvez juste essayer de démontrer le problème, donc je pourrais avoir obtenu une mauvaise idée ici

Espoir qui aide

+0

Merci pour tenter de répondre. Vous étiez en train d'écrire que juste mon illustration avait un problème. L'espace de noms dans le document est vraiment xmlns: xsi = "uriaddress" Alors malheureusement, la question demeure. –

2

ce code:

XDocument d = new XDocument(); 
    XNamespace xsi = "uriaddress"; 
    d.Add(
     new XElement(
      "element", 
      new XAttribute(XNamespace.Xmlns + "xsi", "uriaddress"), 
      new XAttribute("type", "foo"), 
      new XAttribute(xsi + "type", "bar"))); 
    using (XmlWriter xw = XmlWriter.Create(Console.Out)) 
    { 
     d.WriteTo(xw); 
    } 

    d.Element("element").SetAttributeValue("type", "baz"); 
    using (XmlWriter xw = XmlWriter.Create(Console.Out)) 
    { 
     d.WriteTo(xw); 
    } 

    d.Element("element").SetAttributeValue(xsi + "type", "bar");   
    using (XmlWriter xw = XmlWriter.Create(Console.Out)) 
    { 
     d.WriteTo(xw); 
    } 

produit cette sortie (espaces ajoutés et les déclarations XML supprimées pour une meilleure lisibilité):

<element xmlns:xsi="uriaddress" type="foo" xsi:type="bar" /> 

<element xmlns:xsi="uriaddress" type="baz" xsi:type="bar" /> 

<element xmlns:xsi="uriaddress" type="baz" xsi:type="bat" /> 

Si vous ne l'utilisez XDocument (difficile de dire à partir de votre poste d'origine), ce code produit essentiellement le même résultat:

XmlDocument d = new XmlDocument(); 
    d.LoadXml("<element xmlns:xsi='uriaddress' type='foo' xsi:type='bar'/>"); 
    Console.WriteLine(d.OuterXml); 

    d.DocumentElement.SetAttribute("type", "baz"); 
    Console.WriteLine(d.OuterXml); 

    d.DocumentElement.SetAttribute("type", "uriaddress", "bat"); 
    Console.WriteLine(d.OuterXml); 
+0

Robert, Merci de votre aide. Je l'ai fait légèrement différent et cela a bien fonctionné. Fondamentalement, au lieu d'utiliser directement SetAttribute, j'ai d'abord créé l'attribut en tant qu'objet séparé, puis je l'ai ajouté à la liste des attributs. J'ai eu l'idée du code que vous avez posté, pour lequel je vous remercie encore. Mike –

Questions connexes