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.
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());
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
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:
XDocument
XDeclaration
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;
}
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>
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>