it-swarm.com.de

Konvertieren von XML in ein dynamisches C # -Objekt

Ich habe den folgenden C # -Code verwendet, um eine JSON-Datenzeichenfolge mithilfe des JSON.Net-Frameworks in ein dynamisches Objekt zu konvertieren:

// Creates a dynamic .Net object representing the JSON data
var ProductDB = JsonConvert.DeserializeObject<dynamic>(JsonData);

Nach der Konvertierung kann ich mit folgendem Code direkt auf die Elemente zugreifen:

// Variables to be used
string ProductID;
string ProductType;
int ProductQty;

// Loop through each of the products
foreach (dynamic product in ProductDB.products)
{
    ProductID = product.id;
    ProductType = product.type;
    ProductQty = product.qty;
}

Gibt es etwas Ähnliches für die Arbeit mit XML-Daten? Ich könnte einfach JSON.net verwenden, um mein XML in JSON zu konvertieren und dann den obigen Code wiederzuverwenden, aber das fühlt sich an wie Betrug.

Vielen Dank.

50
stuartm
        XDocument doc = XDocument.Parse(xmlData); //or XDocument.Load(path)
        string jsonText = JsonConvert.SerializeXNode(doc);
        dynamic dyn = JsonConvert.DeserializeObject<ExpandoObject>(jsonText);

Ich denke "Schummeln" ist die Antwort - die XML-Lösungen sind sehr lang :)

67
HeatherD

Eine Alternative für zukünftige Besucher, die von ITDevSpace enthält keine Attribute für Elemente mit Kindern.

public class XmlWrapper
{
    public static dynamic Convert(XElement parent)
    {
        dynamic output = new ExpandoObject();

        output.Name = parent.Name.LocalName;
        output.Value = parent.Value;

        output.HasAttributes = parent.HasAttributes;
        if (parent.HasAttributes)
        {
            output.Attributes = new List<KeyValuePair<string, string>>();
            foreach (XAttribute attr in parent.Attributes())
            {
                KeyValuePair<string, string> temp = new KeyValuePair<string, string>(attr.Name.LocalName, attr.Value);
                output.Attributes.Add(temp);
            }
        }

        output.HasElements = parent.HasElements;
        if (parent.HasElements)
        {
            output.Elements = new List<dynamic>();
            foreach (XElement element in parent.Elements())
            {
                dynamic temp = Convert(element);
                output.Elements.Add(temp);
            }
        }

        return output;
    }
}
3
CrashM

Aus der Antwort von @ FSX habe ich erfolgreich die Lösung von " Parse XML zu dynamischem Objekt in C # " verwendet:

public class XmlToDynamic
{
    public static void Parse(dynamic parent, XElement node)
    {
        if (node.HasElements)
        {
            if (node.Elements(node.Elements().First().Name.LocalName).Count() > 1)
            {
                //list
                var item = new ExpandoObject();
                var list = new List<dynamic>();
                foreach (var element in node.Elements())
                {                        
                    Parse(list, element);                        
                }

                AddProperty(item, node.Elements().First().Name.LocalName, list);
                AddProperty(parent, node.Name.ToString(), item);
            }
            else
            {
                var item = new ExpandoObject();

                foreach (var attribute in node.Attributes())
                {
                    AddProperty(item, attribute.Name.ToString(), attribute.Value.Trim());
                }

                //element
                foreach (var element in node.Elements())
                {
                    Parse(item, element);
                }

                AddProperty(parent, node.Name.ToString(), item);
            }
        }
        else
        {
            AddProperty(parent, node.Name.ToString(), node.Value.Trim());
        }
    }

    private static void AddProperty(dynamic parent, string name, object value)
    {
        if (parent is List<dynamic>)
        {
            (parent as List<dynamic>).Add(value);
        }
        else
        {
            (parent as IDictionary<String, object>)[name] = value;
        }
    }
}
1
RMalke

Cinchoo ETL - eine Open Source-Bibliothek, die zum Parsen von XML in ein dynamisches Objekt verfügbar ist

using (var p = ChoXmlReader.LoadText(xml).WithXPath("/"))
{
    foreach (dynamic rec in p)
        Console.WriteLine(rec.Dump());
}

Checkout CodeProject-Artikel für zusätzliche Hilfe.

Haftungsausschluss: Ich bin der Autor dieser Bibliothek.

0
RajN