web-dev-qa-db-fra.com

Comment imprimer <? Xml version = "1.0"?> À l'aide de XDocument

Existe-t-il un moyen pour qu'un XDocument imprime la version xml lors de l'utilisation de la méthode ToString? Demandez-lui de produire quelque chose comme ceci:

<?xml version="1.0"?>
<!DOCTYPE ELMResponse [
]>
<Response>
<Error> ...

J'ai ce qui suit:

var xdoc = new XDocument(new XDocumentType("Response", null, null, "\n"), ...

qui affichera ce qui est bien, mais il manque la "<? version xml" comme indiqué ci-dessus.

<!DOCTYPE ELMResponse [
]>
<Response>
<Error> ...

Je sais que vous pouvez le faire en le sortant manuellement moi-même. Je voulais juste savoir si c'était possible en utilisant XDocument.

61
JD Frias

En utilisant XDeclaration. Cela ajoutera la déclaration.

Mais avec ToString() vous n'obtiendrez pas la sortie souhaitée.

Vous devez utiliser XDocument.Save() avec l'une de ses méthodes.

Échantillon complet:

var doc = new XDocument(
        new XDeclaration("1.0", "utf-16", "yes"), 
        new XElement("blah", "blih"));

var wr = new StringWriter();
doc.Save(wr);
Console.Write(wr.ToString());
110
EricSch

C'est de loin la meilleure façon et la plus gérable:

var xdoc = new XDocument(new XElement("Root", new XElement("Child", "台北 Táiběi.")));

string mystring;

using(var sw = new MemoryStream())
{
    using(var strw = new StreamWriter(sw, System.Text.UTF8Encoding.UTF8))
    {
         xdoc.Save(strw);
         mystring = System.Text.UTF8Encoding.UTF8.GetString(sw.ToArray());
    }
}

et je dis cela simplement parce que vous pouvez changer l'encodage en n'importe quoi en changeant .UTF8 en .Unicode ou .UTF32

14
Kevin

Réponse tardive à une vieille question, mais je vais essayer de fournir plus de détails que les autres réponses.

Ce que vous demandez, s'appelle une déclaration XML .

Tout d'abord, le XDocument a une propriété Declaration de type XDeclaration pour cela. Vous pouvez soit utiliser une autre surcharge du constructeur XDocument:

var xdoc = new XDocument(
  new XDeclaration("1.0", null, null), // <--- here
  new XDocumentType("Response", null, null, "\n"), ... 
  );

ou définissez la propriété ultérieurement:

xdoc.Declaration = new XDeclaration("1.0", null, null);

Mais selon la façon dont vous enregistrez ou écrivez votre XDocument plus tard, la déclaration (ou des parties de celle-ci) peut être ignorée. Plus sur cela plus tard.

La déclaration XML peut avoir plusieurs apparences. Voici quelques exemples valides:

<?xml version="1.0"?>                                        new XDeclaration("1.0", null, null)
<?xml version="1.1"?>                                        new XDeclaration("1.1", null, null)
<?xml version="1.0" encoding="us-ascii"?>                    new XDeclaration("1.0", "us-ascii", null)
<?xml version="1.0" encoding="utf-8"?>                       new XDeclaration("1.0", "utf-8", null)
<?xml version="1.0" encoding="utf-16"?>                      new XDeclaration("1.0", "utf-16", null)
<?xml version="1.0" encoding="utf-8" standalone="no"?>       new XDeclaration("1.0", "utf-8", "no")
<?xml version="1.0" encoding="utf-8" standalone="yes"?>      new XDeclaration("1.0", "utf-8", "yes")
<?xml version="1.0" standalone="yes"?>                       new XDeclaration("1.0", null, "yes")

Notez que XDeclaration acceptera volontiers les arguments invalides, donc c'est à vous de faire les choses correctement.

Dans de nombreux cas, le premier, <?xml version="1.0"?>, Le formulaire que vous demandez, est parfait (il n'est pas nécessaire de donner encoding s'il ne s'agit que d'UTF-8 (y compris ASCII), et il est pas besoin de spécifier standalone si sa valeur prévue est "no" ou s'il n'y a pas de DTD).

Notez que xdoc.ToString() va faire le remplacement de la classe de base XNode (dans ma version de .NET) et n'inclut pas la déclaration XML . Vous pouvez facilement créer une méthode pour y faire face, comme ceci:

public static string ToStringWithDecl(this XDocument d)
  => $"{d.Declaration}{Environment.NewLine}{d}";

Certaines des autres réponses indiquent que le XDeclaration sera respecté si vous utilisez les méthodes xdoc.Save Ou xdoc.WriteTo, Mais ce n'est pas tout à fait vrai:

  • Ils peuvent inclure une déclaration XML même si vous n'en avez pas dans votre XDocument
  • Ils peuvent spécifier l'encodage utilisé par le fichier cible, le flux, l'auteur, le générateur de chaînes, etc. au lieu de l'encodage que vous avez donné, ou au lieu d'omettre l'encodage si vous l'avez fait dans votre XDeclaration
  • Ils peuvent changer votre version, par exemple 1.1 Dans 1.0

Bien sûr, lorsque vous enregistrez/écrivez dans un fichier, c'est une bonne chose que la déclaration corresponde au véritable encodage de ce fichier!

Mais parfois, lorsque vous écrivez dans une chaîne en mémoire, vous ne voulez pas le utf-16 (Même si vous réalisez que les chaînes .NET sont en UTF-16 en interne). Vous pouvez utiliser la méthode d'extension ci-dessus à la place. Ou vous pouvez utiliser la version piratée suivante de la méthode de la réponse d'EricSch:

  string xdocString;
  using (var hackedWriter = new SuppressEncodingStringWriter())
  {
    xdoc.Save(hackedWriter);
    xdocString = hackedWriter.ToString();
  }

où vous avez:

// a string writer which claims its encoding is null in order to omit encoding in XML declarations
class SuppressEncodingStringWriter : StringWriter
{
  public sealed override Encoding Encoding => null;
}
7
Jeppe Stig Nielsen

Tapez juste ceci

var doc =
    new XDocument (
        new XDeclaration ("1.0", "utf-16", "no"),
        new XElement ("blah", "blih")
    );

Et vous obtenez

<?xml version="1.0" encoding="utf-16" standalone="no"?>
<blah>blih</blah>
2
Yann Schwartz

CODE Solution VB.NET

Code

   Dim _root As XElement = <root></root>
   Dim _element1 As XElement = <element1>i am element one</element1>
   Dim _element2 As XElement = <element2>i am element one</element2>
   _root.Add(_element1)
   _root.Add(_element2)
   Dim _document As New XDocument(New XDeclaration("1.0", "UTF-8", "yes"), _root)
   _document.Save("c:\xmlfolder\root.xml")

Sortie Remarque (veuillez ouvrir la sortie dans le bloc-notes)

 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <root>
   <element1>i am element one</element1>
   <element2>i am element one</element2>
</root>
0
Abdul Saboor