Domanda

Sto costruendo un app Parti al fine di imparare il C # e WPF. I problemi cercando l'aggiunta di nuove parti usando XmlWriter. Posso creare il file XML, ma non riesco a capire come aggiungere parti aggiuntive. Dovrei usare qualcos'altro come XmlDocument? Qui è il mio codice dietro:

private void btnSave_Click(object sender, RoutedEventArgs e)
    {

        XmlWriterSettings settings = new XmlWriterSettings();
        settings.Encoding = Encoding.UTF8;
        settings.Indent = true;

        using (XmlWriter writer = XmlWriter.Create("f:\\MyParts.xml", settings))
        {
            writer.WriteStartDocument();
            writer.WriteStartElement("MyParts");
            writer.WriteStartElement("parts");
            writer.WriteStartElement("item");
            writer.WriteString(txtbxitem.Text);
            writer.WriteEndElement();

            writer.WriteStartElement("color");
            writer.WriteString(txtbxcolor.Text);
            writer.WriteEndElement();

            writer.WriteStartElement("size");
            writer.WriteString(txtbxsize.Text);
            writer.WriteEndElement();

            writer.WriteEndElement();
            writer.WriteEndDocument();

            writer.Flush();
            writer.Close();

        }
    }

Questo codice crea il file XML e un nodo in modo corretto, ma come posso aggiungere parti aggiuntive? Ecco quello che sto cercando di creare:

 <?xml version="1.0" encoding="ISO-8859-1" ?> 

<MyParts>
  <parts>
    <item>Part1</item>
    <color>Red</color>
    <size>SM</size>
  </parts>
  <parts>
    <item>Part2</item>
    <color>Blue</color>
    <size>XXL</size>
  </parts>
</MyParts>
È stato utile?

Soluzione

Personalmente suggerirei usando LINQ to XML. Si tratta di un molto più facile da usare rispetto API XmlDocument.

Ma sì, se si desidera modificare un documento esistente allora tipicamente usando una rappresentazione in memoria è più semplice rispetto all'utilizzo di un'API in streaming. E ' possibile per fare questi ultimi, naturalmente, ma non è facile.

Ecco un esempio per creare lo stesso XML come hai già (diverse dalle dichiarazioni: qualsiasi motivo si sarebbe voler per utilizzare Latin-1 invece di qualcosa come UTF-8 che può rappresentare l'intera di Unicode, btw?)

var doc = new XDocument(
  new XElement("MyParts",
    new XElement("parts",
      new XElement("item", "Part1"),
      new XElement("color", "Red"),
      new XElement("size", "SM")),
    new XElement("parts",
      new XElement("item", "Part2"),
      new XElement("color", "Blue"),
      new XElement("size", "XXL"))));

Poi, se si vuole aggiungere un'altra parte:

doc.Root.Add(
  new XElement("parts",
    new XElement("item", "Part3"),
    new XElement("color", "Green"),
    new XElement("size", "L")));

È vero che ci si aspetta che ci si vuole incapsulare il "creare un elemento parti" bit in un metodo per evitare di ripetere tutto il tempo ... ma si spera si ottiene l'immagine.

Altri suggerimenti

Usa un ciclo, e vi ritroverete con qualcosa di simile:

    var parts = new List<Part>() { ...... parts here ...... };        

    using (XmlWriter writer = XmlWriter.Create("f:\\MyParts.xml", settings))
    {
        writer.WriteStartDocument();
        writer.WriteStartElement("MyParts");

        foreach(var part in parts)
        {
            writer.WriteStartElement("parts");
            writer.WriteStartElement("item");
            writer.WriteString(part.Item);
            writer.WriteEndElement(); // </item>

            writer.WriteStartElement("color");
            writer.WriteString(part.Color);
            writer.WriteEndElement();

            writer.WriteStartElement("size");
            writer.WriteString(part.Size);
            writer.WriteEndElement(); // </size>

            writer.WriteEndElement(); // </parts>
        }
        writer.WriteEndElement(); // </MyParts>
        writer.WriteEndDocument();

        writer.Flush();
        writer.Close();

    }

L'idea generale è che, per ogni parte nella vostra lista di parti, si scrive le "parti" (dovrebbe essere "parte"?) Di tag e tutto il suo contenuto, riempiendo item, color e size con i dati da un Part classe, che nella sua forma più semplice potrebbe essere:

class Part
{
    public string Item { get; set; }
    public Color Color { get; set; }
    public string Size { get; set; }
}

Il codice di cui sopra è esattamente quello che sembra:. Scrive un elemento "MyParts" e poi scrive un elemento figlio "parti" e quindi un elemento figlio "voce" con un valore di tutto ciò che è nella vostra casella di testo

Questo odore sospetto, come i compiti a casa, ed è facilmente Google-in grado, quindi sto solo andando a dare una rapida pseudo-risposta.

(Maggio):

  1. Crea classe appropriata (es) per le parti che hanno i membri che si desidera
  2. Creare una raccolta di questi elementi
  3. Aggiorna che in memoria raccolta dal UI
  4. Salva la raccolta utilizzando la formattazione XML e la funzionalità di vostra scelta (incluso ma non limitato a quello che si sta facendo in precedenza, o LINQ to XML, o serializzazione XML, o ...)

Hai pensato di usare il fuori dalla serializzazione XML di dialogo che viene fornito con .NET? Basta popolano i vostri oggetti all'interno di alcuni di raccolta e quindi utilizzare il Serializzatore XML a persistere in un file. È quindi possibile utilizzare il deserializzatore per idratare gli oggetti.

Questo permetterebbe vostra per passare più tempo sul interfaccia utente dell'applicazione (WPF), e la logica. Tutto quello che devi fare è tutto l'attributo Serializable alla classe.

Ecco un buon esempio: http://www.jonasjohn.de/snippets /csharp/xmlserializer-example.htm

Il più grande vantaggio è che, come si costruisce l'oggetto di dati nel corso del tempo, la serializzazione / deserializzazione crescerà con esso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top