XElement ajoute un xmlns
Je suis en utilisant Linq to XML pour créer un nouveau fichier XML. Une partie du fichier puis-je obtenir à partir d'un fichier XML existant. J'utilise le code suivant pour cette.
var v2 = new XDocument(
new XDeclaration("1.0", "utf-16", ""),
new XComment(string.Format("Converted from version 1. Date: {0}", DateTime.Now)),
new XElement(ns + "keyem",
new XAttribute(XNamespace.Xmlns + "xsd", xsd.NamespaceName),
new XAttribute(XNamespace.Xmlns + "xsi", xsi.NamespaceName),
new XAttribute(xsi + "schemaLocation", schemaLocation.NamespaceName),
new XAttribute("version", "2"),
new XAttribute("description", description),
new XElement(ns + "layout",
new XAttribute("type", type),
new XAttribute("height", height),
new XAttribute("width", width),
settings.Root) //XML from an existing file
Le problème est qu'il ajoute xmlns = "" le premier élément du fichier existant.
Le résultat est:
<?xml version="1.0" encoding="utf-16"?>
<foo
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://tempuri.org/KeyEmFileSchema.xsd KeyEmFileSchema.xsd"
xmlns="http://tempuri.org/KeyEmFileSchema.xsd">
<settings xmlns="">
...
</settings>
</foo>
Le fichier XML, je suis en train de lire à partir de l'air comme ça, mais je peux le changer si nécessaire
<?xml version="1.0" encoding="utf-16"?>
<settings>
<colormaps>
<colormap color="Gray" textcolor="Black"/>
<colormap color="DarkGray" textcolor="White"/>
<colormap color="Black" textcolor="White"/>
<colormap color="Cyan" textcolor="Black"/>
</colormaps>
<macromaps>
<macromap pattern="^@([0-9A-F]{2})\|([0-9A-F]{2})$" replace="{ESC}$1{ESC}$2{MOUSERESET}"/>
<macromap pattern="^$([0-9A-F]{2})\|([0-9A-F]{2})$" replace="{USERCLICK}{ESC}$1{ESC}$2{MOUSERESET}"/>
<macromap pattern="^$([0-9A-F]{2})$" replace="{USERCLICK}{ESC}$1"/>
</macromaps>
<keydefault color="Cyan"/>
<groupdefault color="DarkGray"/>
</settings>
OriginalL'auteur magol | 2010-12-02
Vous devez vous connecter pour publier un commentaire.
Vous voyez ce parce que les paramètres de l'élément (probablement à venir à partir de votre document) ne vivent pas dans cet espace de noms. Il vit dans le répertoire par défaut/null-uri d'espace de noms.
Vous auriez besoin pour transformer votre document en entrée afin de changer son espace de noms.
Quelque peu simplifiée, prenez votre fichier xml et le place dans un autre document, mais, avant qu'il ne sorte, il change les noms de chaque élément contenu dans le fichier xml pour que votre document cible...
Le résultat de ce...
Comme vous pouvez le voir, les paramètres de l'élément est maintenant dans le même espace de noms que l'élément foo. Il s'agit essentiellement d'un moyen rapide et sale de transformation xml, et clairement il ne respecte pas tous les espaces de noms dans le document xml que vous importez. Mais c'est peut-être ce que vous êtes après, ou à tout le moins à la base de quelque chose de plus robuste.
Vous avez besoin soit de transformer le document à l'aide de Xslt techniques, ou de lire chaque élément et de le transformer en code. Fondamentalement, la XDocument vous avez chargé connaît les noms de chaque élément contenu dans le doc, et je sais que ce n'est pas le même espace de noms que foo.
Puis-je modifier le fichier xml j'ai lu pour qu'il soit dans la bonne namepsace?
Avez-vous un extrait de/échantillon de vos paramètres xml?
Aussi, votre exemple de code ne compile pas. Avez-vous supprimé certains de ses aspects? Le 2e ligne de ne pas regarder à droite.
OriginalL'auteur Martin Peck
Vous pourriez écrire une méthode d'extension pour cette.
Cette méthode a une valeur de retour, donc il supporte le chaînage, mais aussi les modifications de la transformation de l'original, de sorte qu'il peut être utilisé sans affectation.
OriginalL'auteur Lesage