web-dev-qa-db-fra.com

Utiliser des littéraux XML en C #?

Est-il possible d'ajouter des données XML littérales dans un fichier de code C #? J'utilise actuellement un littéral multiligne mais cela devient compliqué, comme vous pouvez le voir. Une meilleure façon de faire ça?

string XML = @"<?xml version=""1.0"" encoding=""utf-8""?>
<customUI xmlns=""http://schemas.example.com/customui"">
    <toolbar id=""save"">
    </toolbar>
</customUI>";
31
Robinicks

Les littéraux XML sont une fonctionnalité de VB.NET, pas C #.

Ce que vous avez posté est aussi proche que possible de C #. 

Vous voudrez peut-être envisager de remplacer les guillemets doubles incorporés par des guillemets simples (car les deux types sont des XML valides).

Pour les grandes quantités de XML, vous pouvez envisager la réponse de Marc - en utilisant un fichier XML (chargé une fois et stocké en mémoire), afin de pouvoir tirer parti de l'éditeur XML.

38
Oded

Si le code XML est suffisamment volumineux pour vous gêner, envisagez plutôt d'utiliser un fichier .xml plat, chargé à partir du disque ou incorporé en tant que ressource. Tant que vous ne le chargez qu'une fois (peut-être dans un constructeur statique), cela ne fera aucune différence en termes de performances. Il sera considérablement plus facile à gérer car il utilisera l'éditeur de fichier XML de l'EDI. Et cela ne gênera pas votre code.

17
Marc Gravell

En référence à mon commentaire, je ne pouvais pas me rappeler où j'avais vu cela, mais j'ai finalement trouvé le lien XmlBuilder .

Rétrospectivement, il semble que Linq to XML serait votre meilleur pari. C'est plus propre, plus rapide et plus facile à maintenir que la concaténation de chaînes XML:

XNamespace ns = "http://schemas.example.com/customui";
XDocument doc = new XDocument(
                    new XDeclaration("1.0", "utf-8", "yes"),
                    new XElement(ns + "customUI",
                        new XElement(ns + "taskbar",
                            new XAttribute("id", "save"))
                    )
                );

var stringWriter = new StringWriter();
doc.Save(stringWriter); //Write to StringWriter, preserving the declaration (<?xml version="1.0" encoding="utf-16" standalone="yes"?>)
var xmlString = stringWriter.ToString(); //Save as string
doc.Save(@"d:\out.xml"); //Save to file
12
Abbas

En tant que solution particulière, et très spécifique à chaque cas, si vous travaillez dans un environnement ASP.NET en utilisant le moteur Razor, dans un fichier CSHTML, vous pouvez:

Func<MyType, HelperResult> xml = @<root>
    <item>@(item.PropertyA)</item>
    <item>@(item.PropertyB)</item>
    <item>@(item.PropertyC)</item>
</root>;

Avec l'ajout d'une méthode d'extension:

public static XDocument ToXDocument<T>(this Func<T, HelperResult> source, T item)
{
    return XDocument.Parse(source(item).ToHtmlString());
}

Vous pouvez alors:

XDocument document = xml.ToXDocument(new MyType() {
    PropertyA = "foo",
    PropertyB = "bar",
    PropertyC = "qux",
});

Encore une fois, particulier? Oui . Spécifique au cas? Oui . Mais cela fonctionne et donne un grand Intellisense. ( Remarquez, cela donnera aussi un tas d’avertissements de validité, en fonction de la version de validation du document )

5
Dan Lugg

Le plus proche que nous puissions avoir en C # serait via LINQ, quelque chose comme ça:

var xml = XDocument.Load(
    new StringReader(@"<Books>
    <Book author='Dan Brown'>The Da Vinci Code</Book>
    <Book author='Dan Brown'>The Lost Symbol</Book>
    </Books>"));

var query = from book in xml.Elements("Books").Elements("Book")
    where book.Attribute("author").Value == "Dan Brown"
    select book.Value;

foreach (var item in query) Console.WriteLine(item);
0
Fernando Vezzali