4 Stimmen

Wie kann man durch ein XDocument iterieren, um die komplette XML-Struktur Objekt für Objekt zu erhalten?

Ich habe eine XmlDocument die ich mit XmlNode oder konvertieren Sie sie in eine XDocument und durchlaufen es über LINQ.

<Dataset>
    <Person>
        <PayrollNumber>1234567</PayrollNumber>
        <Surname>Smith-Rodrigez</Surname>
        <Name>John-Jaime-Winston Junior</Name>
        <Skills>
            <Skill>ICP</Skill>
            <Skill>R</Skill>
        </Skills>
        <HomePhone>08 8888 8888</HomePhone> 
        <MobilePhone>041 888 999</MobilePhone>
        <Email>curly@stooge.com</Email>
    </Person>
    <Person>
        <PayrollNumber>12342567</PayrollNumber>
        <Surname>Smith-Rodrigez</Surname>
        <Name>Steve</Name>
        <Skills>
            <Skill>Resus</Skill>
            <Skill>Air</Skill>
        </Skills>
        <HomePhone>08 8888 8888</HomePhone> 
        <MobilePhone>041 888 999</MobilePhone>
        <Email>curly@stooge.com</Email>
    </Person>
</Dataset>

Frage 1

Ich möchte die Personendatensätze/Knoten im XML in ein Business Entity Object (POCO) konvertieren. Dazu muss ich jeweils einen Personenknoten durchlaufen und dann die einzelnen Werte analysieren. Dieser letzte Teil ist an sich schon interessant, aber zuerst muss ich die eigentlichen Personendatensätze abrufen. Das Problem, das ich habe, ist, dass ich, wenn ich nach einzelnen Knoten selektiere (z. B. mit XmlList en XmlDocoment ).

Am Ende werden alle Felder nach Namen aggregiert. Ich bin besorgt, dies für den Fall zu tun, dass einer der Personenknoten unvollständig ist oder sogar fehlt, und dann werde ich nicht wissen, welcher fehlt, wenn ich durchlaufe und die Felder zu Geschäftsobjekten aggregiere. Ich werde versuchen, die Daten zu validieren - siehe Frage 2.

Mir ist klar, dass dies durch Nachdenken erreicht werden kann, aber ich bin interessiert.

Ich habe versucht, nach Person-Objekten zu iterieren:

Opción 1:

foreach (XObject o in xDoc.Descendants("Person"))
{
    Console.WriteLine("Name" + o);
    // [...]
}

Auf diese Weise erhalte ich 2 (korrekte) Personendatensätze, jeweils ein vollständiges, als XML-Dokument formatiertes Dokument. Nur eine Teilmenge des obigen XML-Dokuments.

Doch wie lässt sich der Datensatz nun in einzelne Knoten oder Felder aufteilen - am besten so schmerzlos wie möglich?

Opción 2:

foreach (XElement element in xDoc.Descendants("Person"))
{
    // [...]
}

So erhalte ich die XML-Knoten - nur die Werte - für jede Person in einer einzigen Zeichenfolge, z. B.

1234567Smith-RodrigezJohn-Jaime-Winston JuniorLevel 5, City Central Tower 2, 121 King William StNorth Adelaide 5000ICPR08 8888 8888041 888 999111111curly@stooge.comE

Auch hier kein großer Nutzen.

Frage 2

Ich kann eine Validierung XDocument ganz einfach, es gibt einige gute Beispiele auf MSDN, aber ich würde gerne wissen, wie ich einen falschen Datensatz markieren kann. Im Idealfall möchte ich die guten Datensätze in eine neue Datei filtern können. XDocument und lassen die alten zurück. Ist dies möglich?

4voto

Jon Skeet Punkte 1325502

Das Problem ist, dass Sie die Elemente nur als Zeichenketten ausgeben. Sie müssen Code schreiben, um eine XElement von <Person> in Ihr Business-Objekt. Zugegeben, ich würde erwarten stattdessen das vollständige XML ausdrucken - sind Sie sicher, dass Sie nicht die XElement.Value (die alle absteigenden Textknoten miteinander verknüpft)?

(Ich bin mir über die Antwort auf Ihre zweite Frage nicht sicher - ich schlage vor, dass Sie sie hier als separate Frage stellen, damit wir nicht eine Mischung von Antworten auf einer Seite erhalten).

1voto

Arseni Mourzenko Punkte 47813

Warum nicht mit XML-Deserialisierung?

Es gibt zwei Möglichkeiten, dies zu tun.

  • Die erste ist das Geschäftsobjekt ändern Person um die angegebene XML durch Hinzufügen geeigneter Attribute zu den Person Klasse und ihre Eigenschaften. Das XML ist recht einfach, so dass Sie wahrscheinlich nur die Namen ändern müssen, wenn es keine 1:1-Übereinstimmung zwischen Objekteigenschaften und XML-Knoten gibt. Zum Beispiel müssen Sie angeben [XmlArray("Skills")] y [XmlArrayItem("Skill)] für die Skills Sammlung.

  • Die zweite ist die angegebene XML-Datei in eine Datei umwandeln, die der Standardserialisierung entspricht Ihrer Person Objekt, dann zu deserialisieren.

Die zweite Lösung bietet Ihnen auch die Möglichkeit, "schlechte" Datensätze sehr einfach zu filtern.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X