Das XML, das ich erhalte, wird von einer externen Quelle bereitgestellt, so dass ich es nicht einfach neu formatieren kann. Ich möchte XML-Attribute für meine Entitäten verwenden, anstatt eine linq-Abfrage schreiben zu müssen, die weiß, wie XML und Entität formatiert ist. Hier ein Beispiel:XML-Array deserialisieren, wobei Root Array ist und Elemente Konventionen nicht folgen
<?xml version="1.0"?>
<TERMS>
<TERM>
<ID>2013-2</ID>
<DESC>Spring 2013</DESC>
</TERM>
<TERM>
<ID>2013-3</ID>
<DESC>Summer 2013 Jun&Jul</DESC>
</TERM>
</TERMS>
Ich weiß, das die XMLSerializer ArrayOfTerm statt BEGRIFFE zum Beispiel erwartet, aber dass ich meine Einheit zwicken kann ein anderes Element Namen mit dem XML-Attribute wie folgt aus:
public class TermData
{
[XmlArray("TERMS")]
[XmlArrayItem("TERM")]
public List<Term> terms;
}
public class Term
{
[XmlElement("ID")]
public string id;
[XmlElement("DESC")]
public string desc;
}
und ich die Daten am Deserialisieren etwa so:
TermData data;
XmlSerializer serializer = new XmlSerializer(typeof(TermData));
using (StringReader reader = new StringReader(xml))
{
data = (TermData)serializer.Deserialize(reader);
}
return View(data.terms);
das Problem, das ich bin vor ist, dass Begriffe die Wurzel ist und das Array selbst. Wenn das XML-Element ein Stammelement hätte, das nicht das Array ist, könnte ich meine TermData-Klasse so bearbeiten, dass sie korrekt deserialisiert wird (bereits getestet).
[XmlRoot("ROOT")]
public class TermData
{
[XmlArray("TERMS")]
[XmlArrayItem("TERM")]
public List<Term> terms;
}
Beachten Sie, dass die Verwendung von TERMS als XMLRoot nicht funktioniert. Im Moment ist mein Code wirft
InvalidOperationException: There is an error in XML document (2,2).
InnerException: "<TERMS xmlns=" was not expected.
Das würde mich führen zu glauben, dass der XML nicht richtig formatiert ist, sondern aus meinem Verständnis des Beispiel, das ich gab, ist absolut gültige XML.
Das wäre alles trivial, wenn ich die Quell-XML bearbeiten könnte, aber es könnte Tonnen von anderen Antworten wie diese geben und ich muss in der Lage sein, für alles, was ich bekommen könnte, flex. Ich möchte bestätigen, ob der XMLSerializer diese Art von XML-Struktur unterstützen kann. Ich habe fast alles getestet und kann es nicht deserialisieren, ohne das XML zu bearbeiten. Es wäre auch praktisch, wenn ich keine Wrapper-Klasse (TermData) definieren müsste, um die Liste zu halten, aber das scheint nur zu funktionieren, wenn das XML den Namenskonventionen für den Serializer (ArrayOfTerm usw.) folgt.
Wie groß ist Ihre Datei? Ich stieß auf ein ähnliches Problem (versuchen, log4net XML-Dateien zu lesen) und was ich getan habe, wurde in die XML geladen, injizieren Sie die entsprechenden Root-Tags willkürlich und bewegte sich von dort. –
Das Einfügen eines Root-Elements könnte eine Lösung sein. Ich hatte nicht wirklich daran gedacht, danke für den Vorschlag. Obwohl dieses Problem scheint, sollte es ein gelöstes ohne diese Art von Arbeit sein. – pixelshaded