Laden...

supereinfache XML richtig parsen

Erstellt von Ploetzi vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.076 Views
Ploetzi Themenstarter:in
313 Beiträge seit 2006
vor 13 Jahren
supereinfache XML richtig parsen

verwendetes Datenbanksystem: <XML>
Hallo,
ich habe folgende XML:

<?xml version="1.0" encoding="utf-8"?>
<RESULT imgURL="www.diedomain.de/images/request_12345.jpg">
<ITEM name="test AG" status="nicht betroffen" />
<ITEM name="test3 GmbH" status="betroffen" />
<ITEM name="versuchs GmbH" status="nicht betroffen" />
<ITEM name="bergwerk GmbH" status="betroffen" />
</RESULT>

Wie kann ich die XML am einfachsten in eine List <element> parsen?

struct element{
string name;
string status;
}

Wäre nett wenn mir jemand helfen könnte

C
252 Beiträge seit 2007
vor 13 Jahren

Sollte ganz easy mittels LINQ2XML gehen.
Hier ein kleines Bsp.

50 Beiträge seit 2006
vor 13 Jahren

Hallo,

es gibt hier verschiedene Möglichkeiten. Eine davon ist Linq to XML.

Eine weitere Möglichkeit wäre, die Struktur Deiner XML-Datei in einer Klasse abzubilden und anschließend die Daten aus der Datei mit dem XmlSerializer in die Klasse einzulesen.

Lg

Ploetzi Themenstarter:in
313 Beiträge seit 2006
vor 13 Jahren

LINQ will ich absichtl. nicht nutzen 😃

Wegen dem serializer, wie kann man hier tun, dass er properties uebernimmt..

1.378 Beiträge seit 2006
vor 13 Jahren

Indem du XmlAttribute oder XmlElement Attribute auf deine Properties setzt.

Lg XXX

50 Beiträge seit 2006
vor 13 Jahren

In Deinem Beispiel könnten die Klassen wie folgt aussehen:


using System;
using System.Xml.Serialization;

[Serializable()]
[XmlType(AnonymousType = true)]
[XmlRoot(ElementName = "RESULT", Namespace = "", IsNullable = false)]
public class Result
{
    [XmlAttribute(AttributeName = "imgURL")]
    public string imgURL { get; set; }

    [XmlElement("ITEM")]
    public Item[] Items { get; set; }
}

[Serializable()]
public class Item
{
    [XmlAttribute(AttributeName = "name")]
    public string Name { get; set; }

    [XmlAttribute(AttributeName = "status")]
    public string Status { get; set; }
}

Habe den konstruktiven Vorschlag von dN!3L aufgenommen und umgesetzt.

2.891 Beiträge seit 2004
vor 13 Jahren
50 Beiträge seit 2006
vor 13 Jahren

> ](http://msdn.microsoft.com/de-de/library/bb384054.aspx) sind dir bekannt?){gray}

Hey dN!3L,

ja selbstverständlich sind mir diese bekannt. Da ich diese beiden Klassen aber automatisch aus der Xml-Datei über ein Tool erzeugt habe, wollte ich mir nicht die Mühe machen, alles noch mal komplett zu überarbeiten.

Du hast aber schon recht. Gerade zum Veröffentlichen wäre ein kurzer Codeabschnitt schon sinnvoller gewesen 8)

2.891 Beiträge seit 2004
vor 13 Jahren

Da ich diese beiden Klassen aber automatisch aus der Xml-Datei über ein Tool erzeugt habe[...]

Interessant... was ist das für ein Tool?

Den Status kann man übrigens auch als Enum parsen lassen:


[XmlRoot(ElementName = "RESULT")]
public class Result
{
	[XmlElement("ITEM")]
	public Item[] Items { get; set; }

	[XmlAttribute("imgURL")]
	public string ImagegUrl { get; set; }
}

[DebuggerDisplay("Name: {Name}, Status: {Status}")]
public class Item
{
	[XmlAttribute("name")]
	public string Name { get; set; }

	[XmlAttribute("status")]
	public Status Status { get; set; }
}

public enum Status
{
	[XmlEnum("betroffen")]
	Betroffen,
	[XmlEnum("nicht betroffen")]
	NichtBetroffen
}

...

string xml = 
@"<?xml version=""1.0"" encoding=""utf-8""?>
<RESULT imgURL=""www.diedomain.de/images/request_12345.jpg"">
<ITEM name=""test AG"" status=""nicht betroffen"" />
<ITEM name=""test3 GmbH"" status=""betroffen"" />
<ITEM name=""versuchs GmbH"" status=""nicht betroffen"" />
<ITEM name=""bergwerk GmbH"" status=""betroffen"" />
</RESULT>";

XmlSerializer xmlSerializer = new XmlSerializer(typeof(Result));
using (StringReader stringReader = new StringReader(xml))
{
	Result result = (Result)xmlSerializer.Deserialize(stringReader);
}

50 Beiträge seit 2006
vor 13 Jahren

Interessant... was ist das für ein Tool? XML Schema Definition-Tool (Xsd.exe)

4.938 Beiträge seit 2008
vor 13 Jahren

Das ist mir auch schon negativ beim XSD-Tool aufgefallen, daß der keine automatischen Properties erzeugt (wahrscheinlich noch auf .NET 1.x basierend)...

50 Beiträge seit 2006
vor 13 Jahren

Wie gesagt, es ging ja nur darum, schnell eine Klasse zu erzeugen, um Ploetzi ein kleines Beispiel zu geben.

Ich bin der Meinung, dass man Klassen, die mittels XSD erzeugt wurden, auf jeden Fall noch mal manuell überarbeiten sollte. Aber als Grundgerüst können solche automatisch erzeugten Klassen schon hilfreich sein.

6.862 Beiträge seit 2003
vor 13 Jahren

Hallo,

LINQ will ich absichtl. nicht nutzen 😃

Wieso? "will" hört sich nach freiwillig an, sprich keine technischen Hintergründe. Linq2XML ist eine der allereinfachsten Möglichkeiten XML auszulesen und die ganzen Klassen die du hier beim XmlSerializer brauchst, brauchst man bei Linq nicht.

Baka wa shinanakya naoranai.

Mein XING Profil.