11
votes

Dois-je générer XML comme une chaîne en C #?

Lors de la génération de XML en C #, il y a un problème de le générer comme une chaîne? Dans le passé, j'ai trouvé de la génération de XML très verbeux et convolutionné. Créer le XML via String Concaténation / Un constructeur de cordes semble beaucoup plus facile, mais cela ressemble à une mauvaise pratique.
Dois-je générer xml comme une chaîne?


3 commentaires

La concaténation de la chaîne est fine jusqu'à la première fois qu'une valeur d'attribut contient un &


La concaténation à la chaîne est fine jusqu'à la première fois que tout ce que vous n'avez pas comptabilisé.


Si vous allez essayer une concaténation de chaîne la plupart probablement très bientôt, vous trouverez cette solution beaucoup, bien pire que d'utiliser des classes appropriées à partir de .NET BCL, car ce sera: a) non maintenu B) TRÈS ERROR PRONE (TYPOS, SUPPORTES INVALISÉES , etc.) Prenez le temps de le faire correctement et cela paiera plusieurs fois à l'avenir. La solution la plus maintenable serait celle de DAN (avec XSD et Gén.)


8 Réponses :


13
votes

Les classes xdocument, xelement et xattribute font de la génération XML en C # beaucoup plus facile à faire. Que d'utiliser le xmldocument ou xmlwriter.

À titre d'exemple, pour produire ceci: P>

XDocument xDocument = new XDocument(
    new XElement("RootElement",
        new XElement("ChildElement",
            new XAttribute("Attribute1", "Hello"),
            new XAttribute("Attribute2", "World")
        ),
        new XElement("ChildElement",
            new XAttribute("Attribute1", "Foo"),
            new XAttribute("Attribute2", "Bar")
        )
    )
);


1 commentaires

Devra essayer cela. Merci!



2
votes

Créer le XML via la concaténation de la chaîne est définitivement une mauvaise pratique. Le XMLDOMDocument n'est pas très verbeux ni compliqué; J'ai toujours trouvé que c'était assez facile (et sûr) de travailler avec.


0 commentaires

2
votes

Non, vous ne devriez pas. Les bibliothèques XML dans .NET (et d'autres plates-formes) garantissent que vous créez un XML valide et vous permet de vous préoccuper de l'analyse de l'analyse. De plus, si quelqu'un d'autre doit utiliser votre XML et que cela me plaint est incorrect, vous pouvez Éliminez le XML actuel lui-même et vous économiserons beaucoup de temps à vérifier que vous concatéez correctement.


0 commentaires

7
votes

Avez-vous essayé Linq à XML? Ce n'est pas très verbeux: xxx


0 commentaires

1
votes

Utilisation d'un XMLTextWriter, vous pouvez supprimer les résultats dans un StringBuilder et utiliser la chaîne résultante. En outre, en utilisant le XMLTextWriter, vous pouvez placer le contenu dans un flux. Donc, si vous recherchez une flexibilité, utilisez un XMLTextWriter.

Si votre question concerne la construction d'un fichier XML par la concaténation de la chaîne, ne faites pas cela. Utilisez un StringBuilder si vous allez mettre un document XML ensemble sans aucune autre aide.

J'éviterais de créer manuellement le XML par la "concaténation". Vous augmentez la probabilité d'erreurs dans le XML généré. Les classes de création XML de Microsoft ont été testées plutôt à fond. Utilisez cela à votre avantage.


0 commentaires

3
votes

Je recommanderais l'approche suivante dans la plupart des cas lorsque vous générez XML.

  1. Créez un XSD pour votre XML
  2. compiler le XSD dans un objet
  3. peupler votre objet
  4. désémarifiez votre objet dans XML

    Benifits pour le faire sur la création de XML en utilisant les xmldocuments 1. C'est bien défini avec un XSD. D'autres développeurs savent ce que le XML qu'ils reçoivent est (ou ce qu'ils modifient) 2. Facile à changer dans le futur. 3. Bien plus grande moins de chances de bugs de type TYPO dans votre document XML.

    Faites-moi savoir si vous avez besoin d'exemples de code ou d'assistance supplémentaire dans la manière dont cela serait exécuté.

    Remarque: Nous générons nos fichiers CS de XSDS au moment de la construction pour vous assurer que quelqu'un ne modifie pas manuellement le code généré.


2 commentaires

Oui, mais il a écrit DE-SERIALIZE.


Oui - j'ai eu l'intention de sérialiser mais ne faisait pas attention à ce que j'ai écrit



5
votes

Avant de penser à la génération de XML à l'aide de la concaténation à chaîne au lieu d'une bibliothèque appropriée, veuillez allouer et lire le Spécification XML . Portez une attention particulière aux gentières telles que les caractères et les références de caractères.

Vous pouvez le faire maintenant. Je vais attendre.

Demandez-vous maintenant - Voulez-vous vraiment avoir à vous assurer que votre chaîne concaténée est valide selon toutes ces règles et écrire tous les fonctions d'assistant vous-même, ou souhaitez-vous utiliser une bibliothèque bien testée où toute cette logique a été encapsulé pour vous?

Bien.

content que c'est trié.


2 commentaires

Je recommande également hsivonen.iki.fi/producing-xml pour un résumé de la liste des Problèmes lors de l'écriture de XML ...


+1 pour donner en fait une raison pour laquelle la faire de la concaténation de chaîne est une mauvaise idée



2
votes

XMLWriter n'est pas si mauvais lorsque vous mettez en formatant votre code correctement:

using (XmlWriter writer = XmlWriter.Create(builder))
{
    writer.WriteStartDocument();
    {
        writer.WriteStartElement("root");
        {
            writer.WriteStartElement("Node1");
            writer.WriteAttributeString("att1", "value");
            writer.WriteEndElement();

            writer.WriteStartElement("Node2");
            writer.WriteString("inner text");
            writer.WriteEndElement();
        }
        writer.WriteEndElement();
    }
    writer.WriteEndDocument();
}


0 commentaires