Domanda

Lo sto usando per il mio codice, viene restituito perfettamente al file xml, ma aggiunge un segno '=' dopo il nome dell'elemento anche se solo uno dei miei elementi ha un attributo.

Suppongo che potrei fare qualcosa del genere

if(reader.Getattribute != "")
// I made that up on the spot, I'm not sure if that would really work
{
      Console.WriteLine("<{0} = {1}>", reader.Name, reader.GetAttribute("name"));
}

else
{
      Console.WriteLine("<{0}>", reader.Name);
}

ma esiste un modo più pulito per codificarlo?

Il mio codice (senza soluzione alternativa)

using System;
using System.Xml;
using System.IO;
using System.Text;

public class MainClass
{
    private static void Main()
    {
        XmlWriterSettings settings = new XmlWriterSettings();

        settings.Indent = true;


        XmlWriter w = XmlWriter.Create(@"Path\test.xml", settings);



        w.WriteStartDocument();
        w.WriteStartElement("classes");

        w.WriteStartElement("class");
        w.WriteAttributeString("name", "EE 999");
        w.WriteElementString("Class_Name", "Programming");
        w.WriteElementString("Teacher", "James");
        w.WriteElementString("Room_Number", "333");
        w.WriteElementString("ID", "2324324");
        w.WriteEndElement();




        w.WriteEndDocument();
        w.Flush();
        w.Close();




        XmlReader reader = XmlReader.Create(@"Path\test.xml");

        while (reader.Read())
        {
            switch (reader.NodeType)
            {
                case XmlNodeType.Element:
                    Console.WriteLine("<{0} = {1}>", reader.Name, reader.GetAttribute("name"));
                    break;
                case XmlNodeType.Text:
                    Console.WriteLine(reader.Value);
                    break;
                case XmlNodeType.CDATA:
                    Console.WriteLine("<[CDATA[{0}]>", reader.Value);
                    break;
                case XmlNodeType.ProcessingInstruction:
                    Console.WriteLine("<?{0} {1}?>", reader.Name, reader.Value);
                    break;
                case XmlNodeType.Comment:
                    Console.WriteLine("<!--{0}-->", reader.Value);
                    break;
                case XmlNodeType.XmlDeclaration:
                    Console.WriteLine("<?xml version='1.0'?>");
                    break;
                case XmlNodeType.Document:
                    break;
                case XmlNodeType.DocumentType:
                    Console.WriteLine("<!DOCTYPE {0} [{1}]", reader.Name, reader.Value);
                    break;
                case XmlNodeType.EntityReference:
                    Console.WriteLine(reader.Name);
                    break;
                case XmlNodeType.EndElement:
                    Console.WriteLine("</{0}>", reader.Name);
                    break;
            }
        }
    }
}

Produzione

<?xml version='1.0'?>
<classes = >
<class = EE 999>
<Class_Name = >
Programming
</Class_Name>
<Teacher = >
James
</Teacher>
<Room_Number = >
333
</Room_Number>
<ID = >
2324324
</ID>
</class>
</classes>
È stato utile?

Soluzione

Perché questa linea

case XmlNodeType.Element:
       Console.WriteLine("<{0} = {1}>", reader.Name, reader.GetAttribute("name"));
       break;

Scrive sempre il '=' senza controllare.

Una soluzione approssimativa:

case XmlNodeType.Element:
       Console.WriteLine("<{0}", reader.Name);
       if (reader.HasAttributes)
          // Write out attributes
       Console.WriteLine(">");
       break;

Ma perché stai usando XMLReader? È ingombrante e utile solo quando si tratta di enormi flussi XML.

Se i set di dati non sono >> 10 MB, dai un'occhiata a XDocument o XMLDocument

Ilwriter XML nel tuo esempio può essere sostituito da (approssimativo ca.):

 // using System.Xml.Linq;

        var root = new XElement("classes",
            new XElement("class", new XAttribute("name", "EE 999"),
                new XElement("Class_Name", "Programming"),
                new XElement("Teacher", "James")
                ));

        root.Save(@"Path\test.xml");

     var doc = XDocument.Load(@"Path\test.xml");
     // doc is now an in-memory tree of XElement objects 
     // that you can navigate and query

Ed ecco Un'introduzione

Altri suggerimenti

Non so esattamente cosa stai cercando di realizzare, ma personalmente creerei una classe .NET che rappresenta l'elemento della classe con proprietà che identificano i sottoelementi, quindi utilizzerei System.Xml.Serialization.XmlSerializer per scriverlo o leggerlo da un file.

Ecco un esempio:

using System.Xml.Serialization;

public class MyClasses : List<MyClass>{}    

public class MyClass{
 public String Teacher{ get; set; }
}

void main(){
  MyClasses classList = new MyClasses();

  MyClass c = new MyClass();
  c.Teacher = "James";

  classList.Add(c);

  XmlSerializer serializer = new XmlSerializer(classList.GetType());
  serializer.Serialize(/*Put your stream here*/);
}

E, dopo aver lasciato la configurazione del tuo stream come esercizio al lettore, blamo, hai finito di inviare una rappresentazione XML del tuo oggetto a qualche stream.Il flusso potrebbe essere un file, una stringa o qualunque cosa.Ci scusiamo per il brutto C# (se è brutto), utilizzo VB.NET tutti i giorni, quindi la sintassi e le parole chiave potrebbero essere un po' fuori posto.

Aggiornamento
Ho aggiunto del codice per mostrare come serializzare una raccolta di classi.Se i nodi non vengono nominati correttamente, ci sono attributi che puoi aggiungere alle proprietà della classe, basta fare una rapida ricerca su Google per trovarli.

Aggiorna di nuovo
Mi spiace, è difficile spiegare quando usiamo la stessa parola per indicare due cose diverse.Diciamo che stai cercando di rappresentare un secchio di mattoni.Dovresti scrivere una classe C# chiamata Brick e una classe C# chiamata Bucket quello ereditato da List<Brick> tuo Brick avrebbe una proprietà chiamata Color.Dovresti quindi realizzare tutti i tuoi mattoncini con colori diversi e riempire il secchio con i tuoi mattoncini.Quindi passeresti il ​​tuo bucket al serializzatore e ti darebbe qualcosa del tipo:

<Bucket>    
  <Brick>  
    <Color>    
      blue     
    </Color>  
  </Brick>   
</Bucket> 

Il serializzatore crea l'XML per te dalle definizioni delle tue classi in modo che tu non debba preoccuparti dei dettagli.Puoi leggere di più a riguardo Qui E Qui

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