Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.
Καλησπέρα,
ο παρακάτω κώδικας είναι σε c# για Visual Studio και θέλω να κάνω read  ta Attributes tou element date και εδώ κολλάω. 1ον τα έχω σωστά τα wright .??και  2ον αν ναι τότε πώς τα κάνω read.???
 
 
           writer.WriteStartElement("Location");
            writer.WriteString(textBox15.Text);
            writer.WriteEndElement();//RecordedBy
 
            writer.WriteStartElement("RecordedBy");
            writer.WriteString(textBox2.Text);
            writer.WriteEndElement();//RecordedBy
 
            writer.WriteStartElement("Date");
            writer.WriteAttributeString("Temperature", textBox11.Text);
            writer.WriteAttributeString("LightIntensity", textBox12.Text);
            writer.WriteString(textBox3.Text);
            writer.WriteEndElement();//Date

Ευχαριστώ.


 
Δημοσ.

Ίσως να ήταν μια καλή ιδέα να βάλεις ένα δείγμα από το πως θες να είναι η δομή του xml αρχείου που θες να φτιάξεις αρχικά και να διαβάσεις αργότερα.

Δημοσ.

<?xml version="1.0" encoding="utf-8"?>
<Root>
  <Location>textBox15.Text</Location>
  <RecordedBy>textBox2.Text</RecordedBy>
  <Date Temperature="textBox11.Text" LightIntensity="textBox12.Text">textBox3.Text</Date>
</Root>

Έχεις το Root η όπως αλλιώς είναι το όνομα του RootElement σου (Σημείωση:ΠΡΕΠΕΙ ΝΑ ΥΠΑΡΧΕΙ ΥΠΟΧΡΕΩΤΙΚΑ ΣΕ ΚΑΘΕ XML ΑΡΧΕΙΟ ΚΑΙ ΝΑ ΕΙΝΑΙ ΜΟΝΑΔΙΚΟ).Αν η μορφή που θες είναι αυτή καλώς αν όχι πρέπει να προσέξεις που κλείνεις τα Elements με την

writer.WriteEndElement.

 

Για να διαβάσεις το παραπάνω Xml δοκίμασε αυτό

XmlReaderSettings rsettings = new XmlReaderSettings();
rsettings.ConformanceLevel = ConformanceLevel.Document;
rsettings.CloseInput = true;

using (XmlReader reader = XmlReader.Create("output.xml", rsettings))
{
    while (reader.Read())
    {
        if (reader.IsStartElement())
        {
            if (reader.IsEmptyElement)
                Console.WriteLine("<{0}/>", reader.Name);
            else
            {
                Console.Write("<{0}> ", reader.Name);
                if (reader.HasAttributes)
                {
                    Console.WriteLine("Attributes of <" + reader.Name + ">");
                    while (reader.MoveToNextAttribute())
                    {
                        Console.WriteLine(" {0}={1}", reader.Name, reader.Value);
                    }
                    // Move the reader back to the element node.
                    reader.MoveToElement();
                }
                reader.Read(); // Read the start tag. 
                            
                if (reader.IsStartElement())  // Handle nested elements.
                    Console.Write("\r\n<{0}>", reader.Name);
                Console.WriteLine(reader.ReadString());  //Read the text content of the element.
                            
            }
        }
    }
}

Χρησιμοποίησα XmlReader που διαβάζει από ένα output.xml

 

 

Όσο ο Reader έχει δεδομένα

while (reader.Read()) 

τότε

 

αν διάβασε το tag που ξεκινά ένα element

reader.IsStartElement()

Ελέγχει αν είναι κενό Element <Location></Location> ή <Location /> πχ

if (reader.IsEmptyElement)
   Console.WriteLine("<{0}/>", reader.Name);

Αλλιώς

 

κοιτάζει αν εχει attributes.Όσο η reader.MoveToNextAttribute() είναι true κοινώς όσο βρίσκει Attributes διαβάζει τις τιμές τους και το όνομα τους.

if (reader.HasAttributes)
{
  Console.WriteLine("Attributes of <" + reader.Name + ">");
  while (reader.MoveToNextAttribute())
  {
   Console.WriteLine(" {0}={1}", reader.Name, reader.Value);
  }
  // Move the reader back to the element node.
  reader.MoveToElement();
}

Στο τέλος επιστρέφει το reader στο σημείο που ήταν πριν αρχίσει να διαβάζει τα attributes.

 

Σημείωση: Ο κώδικας παραπάνω δουλεύει μόνο με ξεχωριστά elements όπως είναι στην μορφή που ανέφερα αρχικά.Αν το xml αρχείο σου περιέχει nested elements πχ

 

<?xml version="1.0" encoding="utf-8"?>
<Root>
  <Location>
   <RecordedBy>textBox2.Text</RecordedBy>
   <Date Temperature="textBox11.Text" LightIntensity="textBox12.Text">textBox3.Text</Date>
  </Location>
</Root>

δεν κάνει ελεγχο για το αν έχουν Attributes.Αφήνεται σαν άσκηση προς τον αναγνώστη το πως θα το κάνεις να δουλέψει και για nested elements.

 

Βέβαια υπάρχει και η άμεση και σύντομη λύση,αν ξέρεις ποιο elements έχει τα attributes τότε με την

reader.ReadToFollowing("Date");
string Temperature = reader.GetAttribute("Temperature");
string LightIntensity = reader.GetAttribute("LightIntensity");
Console.WriteLine("The Temperature value: " + Temperature);
Console.WriteLine("The LightIntensity value: " + LightIntensity);

Σεντονάκι βγήκε τελικά συγνώμη για αυτό.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...