2009-09-21 6 views
3

Je crée du XML en utilisant Linq to XML et C#. Tout fonctionne très bien sauf quand je dois ajouter manuellement une ligne dans le XML. Cette ligne n'est ajoutée que si j'ai une valeur à lui passer, sinon j'ignore tout le tag.comment ajouter (ou ignorer) l'espace de noms XML lors de l'utilisation de XElement.Load

J'utilise XElement.Load pour charger dans la chaîne de texte que je stocke dans une chaîne, mais quand je l'attache au XML, il met toujours dans xmlns = "" à la fin de mon tag.

Y a-t-il un moyen de dire à XElement.Load d'utiliser l'espace de noms existant ou de l'ignorer lors de l'insertion de la chaîne dans le XML?

Idéalement, je veux juste que ma chaîne soit incluse dans le XML en cours de création sans ajout de balises supplémentaires.

est Ci-dessous un échantillon de ce que je fais actuellement:

string XMLDetails = null; 
if (ValuePassedThrough != null) 
XMLDetails = "<MyNewTag Code=\"14\" Value=\"" + ValuePassedThrough +"\"></MyNewTag>"; 

Lorsque je construis le XML que je charge la chaîne ci-dessus dans mon XML. C'est ici que xmlns = "" est ajouté à la valeur XMLDetails mais, idéalement, je veux que cela soit ignoré car cela cause des problèmes avec le destinataire lorsqu'il essaie de lire cette balise.

XNamespace ns = "http://namespace-address"; 
    XNamespace xsi = "http://XMLSchema-instance-address"; 

XDocument RequestDoc = new XDocument(
    new XDeclaration("1.0", "utf-8", null), 
    new XElement(ns + "HeaderTag", 
     new XAttribute("xmlns", ns), 
new XAttribute(XNamespace.Xmlns + "xsi", xsi), 
new XAttribute(xsi + "schemaLocation", "http://www.addressofschema.xsd"), 
     new XAttribute("Version", "1"), 
      new XElement(ns + "OpeningTAG", 

... Mon code XML ...

XElement.Load(new StringReader(XMLDetails)) 

... Fin du code XML ...

Comme mentionné ci-dessus. Mon code fonctionne, il génère du XML avec succès pour moi. C'est juste la balise MyNewTag que je charge en utilisant XElement.Load obtient xmlns = "" ajouté à la fin de celui qui me cause un problème.

Des idées comment je peux contourner cela? Merci de votre aide.

Cordialement, riches

Répondre

7

Que diriez-vous:

XElement withoutNamespace = XElement.Load(new StringReader(XMLDetails)); 
XElement withNamespace = new XElement(ns + withoutNamespace.Name.LocalName, 
             withoutNamespace.Nodes()); 

comme une meilleure alternative - pourquoi ne pas non plus inclure l'espace de noms lorsque vous construisez le XML, ou mieux encore, créer un XElement au lieu de générer manuellement une chaîne XML que vous lisez ensuite. La création manuelle de XML est très rarement une bonne idée. Mis à part toute autre chose, vous supposez que ValuePassedThrough a déjà été échappé, ou n'a pas besoin d'échapper, etc. peut être valide - mais c'est au moins un sujet de préoccupation.

+0

Salut Jon, merci pour votre aide. Votre réponse est logique, mais lorsque j'essaie d'utiliser votre suggestion, VS me dit que System.Xml.Linq.XElement ne contient pas de définition pour 'LocalName'. Je suis d'accord avec votre point sur la construction manuelle du XML en tant que chaîne, mais si j'ai besoin d'appliquer la logique, comment puis-je faire cela au milieu de la création du XML lors de la construction avec Linq? Merci encore. –

+0

Oups, édité pour obtenir le nom local du XName. Vous pouvez construire le XML de la même manière que vous le faites maintenant - il suffit de faire de XMLDetails un XElement au lieu d'une chaîne. Malheureusement, la façon dont vous utiliserez XMLDetails ne sera pas entièrement claire, mais cela devrait fonctionner correctement. Si non, veuillez donner plus de détails - ou de préférence un programme court mais complet. –

1

Vous aimez cette

XElement XMLDetails = new XElement(ns + "OpeningTAG", new XElement(ns + "MyNewTag", new XAttribute("Code", 14), new XAttribute("Value", 123))); 

XDocument RequestDoc = new XDocument(
    new XDeclaration("1.0", "utf-8", null), 
    new XElement(ns + "HeaderTag", 
     new XAttribute("xmlns", ns), 
new XAttribute(XNamespace.Xmlns + "xsi", xsi), 
new XAttribute(xsi + "schemaLocation", "http://www.addressofschema.xsd"), 
     new XAttribute("Version", "1"), 
      XMLDetails)); 
Questions connexes