Salvataggio e scrittura di un documento

Quando si carica e si salva un XmlDocument, il documento salvato potrebbe essere diverso dall'originale nei seguenti modi:

  • Se la proprietà PreserveWhitespace viene impostata su true prima della chiamata al metodo Save, lo spazio vuoto nel documento viene mantenuto nell'output. In caso contrario, se la proprietà è false, XmlDocument applica automaticamente un rientro all'output.
  • Tutti gli spazi tra gli attributi vengono ridotti a un singolo carattere di spazio.
  • Lo spazio tra gli elementi viene modificato. I caratteri spazio significativi vengono mantenuti, a differenza di quelli non significativi. Quando il documento viene salvato, per impostazione predefinita utilizzerà la modalità XmlTextWriter Indenting per stampare accuratamente l'output in modo che sia più leggibile.
  • Il carattere virgoletta utilizzato intorno ai valori degli attributi viene modificato in virgolette doppie per impostazione predefinita. È possibile utilizzare la proprietà QuoteChar su XmlTextWriter per impostare il carattere virgoletta su virgolette doppie o virgoletta singola.
  • Per impostazione predefinita, le entità generali come &abc;vengono mantenute. Se si crea un XmlValidatingReader che ha l'impostazione predefinita EntityHandling di ExpandEntities, quindi si richiama Load, le entità generali verranno espanse e si perderanno le entità generali nel documento salvato.
  • Per impostazione predefinita, le entità di caratteri numerici come {vengono espanse.
  • Il contrassegno dell'ordine dei byte trovato nel documento di input non viene mantenuto. UCS-2 viene salvato nel formato UTF-8 a meno che non si crei esplicitamente una dichiarazione XML che specifichi una codifica diversa.
  • Se si vuole riportare un XmlDocument in un file o in un flusso, l'output riportato sarà uguale al contenuto del documento, il che significa che l'XmlDeclaration viene riportata solo se è contenuta nel documento e la codifica utilizzata per riportare il documento è uguale alla codifica data nel nodo di dichiarazione.

Scrittura di una XmlDeclaration

I metodi XmlDocument e XmlDeclaration di OuterXml, InnerXml e WriteTo, oltre ai metodi XmlDocument di Save e WriteContentTo, creano una dichiarazione XML.

Per i metodi XmlDocument di OuterXml, InnerXml, e i metodi Save(Stream stm) Save(String filename), WriteTo e WriteContentTo, la codifica riportata nella dichiarazione XML viene presa dal nodo XmlDeclaration. Se non vi è un nodo XmlDeclaration, la XmlDeclaration non viene riportata. Se non vi è una codifica nel nodo XmlDeclaration, la codifica non viene riportata nella dichiarazione XML.

I metodi Save(TextWriter writer) e Save(XmlWriter writer) riportano sempre una XmlDeclaration. Questi metodi prendono la codifica dal writer sul quale stanno scrivendo. Vale a dire che il valore di codifica sul writer esegue l'override della codifica sul documento e nell'oggetto XmlDeclaration. Il codice seguente, ad esempio, non scrive una codifica nella dichiarazione XML trovata nel file di output out.xml.

Dim tw As New XmlTextWriter("out.xml", Nothing)
doc.load("text.xml")
doc.Save(tw)
[C#]
XmlTextWriter tw = new XmlTextWriter("out.xml", null);
doc.load("text.xml");
doc.Save(tw);

Per il metodo Save(XmlTextWriter writer), la dichiarazione XML viene riportata utilizzando il metodo WriteStartDocument nella classe XmlWriter. Per questo motivo, sovrascrivendo il metodo WriteStartDocument si modifica il modo in cui viene scritto l'inizio del documento.

Per i metodi XmlDeclaration di OuterXml, WriteTo e InnerXml, non viene riportata alcuna codifica, se la proprietà Encoding non è impostata. In caso contrario, la codifica scritta nella dichiarazione XML sarà uguale alla codifica trovata nella proprietà Encoding.

Scrittura del contenuto del documenti tramite la proprietà OuterXml

La proprietà OuterXml è un'estensione Microsoft agli standard del modello DOM (Document Object Model) W3C. Tale proprietà viene utilizzata per ottenere il tag dell'intero documento XML o di un singolo nodo e dei relativi nodi figlio. OuterXml restituisce il tag rappresentante il nodo dato e tutti i nodi figlio.

Nell'esempio di codice che segue viene illustrato il salvataggio di un intero documento come stringa.

Dim mydoc As New XmlDocument()
' Perform application needs here, like mydoc.Load("myfile");
' Now save the entire document to a string variable called "xml".
Dim xml As String = mydoc.OuterXml

[C#]

XmlDocument mydoc = new XmlDocument();
// Perform application needs here, like mydoc.Load("myfile");
// Now save the entire document to a string variable called "xml".
string xml = mydoc.OuterXml;

Nell'esempio di codice che segue viene illustrato il salvataggio del solo elemento del documento.

' For the content of the Document Element only.
Dim xml As String = mydoc.DocumentElement.OuterXml

[C#]

// For the content of the Document Element only.
string xml = mydoc.DocumentElement.OuterXml;

Al contrario, se si desidera il contenuto dei nodi figlio, è possibile utilizzare la proprietà InnerText.

Un aspetto della proprietà OuterXml influisce sull'output generato da un documento, ad esempio quando si definisce un elemento come nodo EntityReference in XML. Nel DTD, l'elemento è stato definito con un attributo predefinito. La proprietà OuterXml non consente di scrivere gli attributi predefiniti per l'elemento. Si supponga, ad esempio, che sia stata dichiarata la seguente entità generale, il cui testo di sostituzione si trova in un file denominato 013.ent, illustrato di seguito:

013.ent

<e/>

Nell'esempio, nel seguente XML denominato X_Entity.XML è contenuto un DTD con l'elemento definito come dotato di attributi predefiniti:

X_Entity.XML

<!DOCTYPE doc [

<!ELEMENT doc (e)><!ELEMENT e (#PCDATA)><!ATTLIST e a1 CDATA "a1 default" a2 NMTOKENS "a2 default"><!ENTITY x SYSTEM "013.ent">]><doc>&x;</doc>

Quando l'XML viene analizzato, la riga di codice <!ENTITY x SYSTEM "013.ent"> definisce dove trovare il testo di sostituzione per l'entità x. Quando viene analizzato il documento e rilevato l'EntityReference &x;, il file 013.ent viene individuato e &x; sostituito dalla definizione. La parte più importante della definizione corrisponde ai seguenti dati xml:

<doc>

<e a1="a1 default" a2="a2 default" />

</doc>

Tuttavia, quando si utilizza la proprietà OuterXml, l'output effettivo è il seguente:

Output

<!DOCTYPE doc [

<!ELEMENT doc (e)><!ELEMENT e (#PCDATA)><!ATTLIST e a1 CDATA "a1 default" a2 NMTOKENS "a2 default"><!ENTITY x SYSTEM "013.ent">]><doc><e /></doc>

-------------------------
AttributeCount 2

Il codice che segue viene utilizzato per testare gli attributi predefiniti. Viene inoltre riportato l'output che non contiene gli attributi predefiniti definiti nel DTD.

Imports System
Imports System.Data
Imports System.Xml
Imports System.Xml.XPath
Imports System.Runtime.Remoting

Namespace TestSimple

    Public Class MyTestApp
      
        Public Shared Sub Main()
            Dim treader As New XmlTextReader("X_Entity.xml")
            Dim vrdr As New XmlValidatingReader(treader)
            Dim xDoc As New XmlDocument()
            xDoc.Load(vrdr)
            Console.WriteLine(("AttributeCount " + CType(xDoc.DocumentElement.ChildNodes(0), XmlElement).Attributes.Count))
            Console.WriteLine("-------------------------")
            Console.WriteLine(xDoc.OuterXml)
        End Sub 'Main
    End Class 'MyTestApp
End Namespace 'TestSimple
[C#]
using System;
using System.Data;
using System.Xml;
using System.Xml.XPath;
using System.Runtime.Remoting;

namespace TestSimple {
 public class MyTestApp
    {
    public static void Main()
    {
        XmlTextReader treader = new XmlTextReader("X_Entity.xml");
        XmlValidatingReader vrdr = new XmlValidatingReader(treader);
        XmlDocument xDoc = new XmlDocument();
        xDoc.Load (vrdr);
        Console.WriteLine(xDoc.OuterXml);
        Console.WriteLine("-------------------------");
        Console.WriteLine("AttributeCount " + ((XmlElement)(xDoc.DocumentElement.ChildNodes[0])).Attributes.Count);
    }
    }
}

Vedere anche

Modello a oggetti di documenti XML (Document Object Model, DOM)