Как разобрать XML в IList <BusinessObject>, используя XPath в C #? - PullRequest
3 голосов
/ 04 июля 2011

У меня есть следующий XML в строке:

<RootElement>
    <Data>
        <Row>
            <Id>1</Id>
            <Name>Foo</Name>
        </Row>
        <Row>
            <Id>2</Id>
            <Name>Bar</Name>
        </Row>
    </Data>
</RootElement>

И следующий класс:

public class BusinessObject
{
    public int Id { get; set; }
    public string Name { get; set; }
}

Как я могу проанализировать все данные в элементах строки в IList, используяXPath?

Мне нужно изучить это для обучения.

Спасибо за ваши ответы.

Ответы [ 3 ]

4 голосов
/ 04 июля 2011
IEnumerable<BusinessObject> ParseWithXPath(string xml)
{
    XmlDocument doc = new XmlDocument();
    doc.LoadXml(xml);
    foreach (XmlNode node in doc.DocumentElement.SelectNodes("Data/Row")) // XPath query
    {
        yield return new BusinessObject
        {
            Id = Int32.Parse(node.SelectSingleNode("Id").InnerText),
            Name = node.SelectSingleNode("Name").InnerText
        };
    }
}

Использование:

IEnumerable<BusinessObject> seq = ParseWithXPath(xml); // .NET 2.0+

IList<BusinessObject> list = new List<BusinessObject>(seq); // .NET 2.0+
3 голосов
/ 04 июля 2011

Я вижу, вы уже нашли довольно чистое решение, пока я кодировал для вас пример.

Возможно, это поможет вам немного больше:

internal static class XMLToListWithXPathExample
{
    static XmlDocument xmlDocument;
    static List<BusinessObject> listBusinessObjects;
    static string sXpathStatement = "/Data/Row";

    static void LoadXMLData(string p_sXMLDocumentPath)
    {   
        xmlDocument = new XmlDocument(); // setup the XmlDocument
        xmlDocument.Load(p_sXMLDocumentPath); // load the Xml data
    }

    static void XMLDocumentToList()
    {
        listBusinessObjects = new List<BusinessObject>(); // setup the list
        foreach (XmlNode xmlNode in xmlDocument.SelectNodes(sXpathStatement)) // loop through each node
        {
            listBusinessObjects.Add( // and add it to the list
                new BusinessObject(
                    int.Parse(xmlNode.SelectSingleNode("Id").InnerText), // select the Id node
                    xmlNode.SelectSingleNode("Name").InnerText)); // select the Name node
        }

    }
}

public class BusinessObject
{
    public int Id { get; set; }
    public string Name { get; set; }

    // constructor
    public BusinessObject(int p_iID, string p_sName)
    {
        Id = p_iID;
        Name = p_sName;
    }

}

С уважением, Нико

0 голосов
/ 04 июля 2011
IEnumerable<BusinessObject> busObjects = from item in doc.Descendants("Row")
                                         select new BusinessObject((int)item.Element("Id"), (string)item.Element("Name"));

Вы можете попробовать что-то вроде выше. Ваш BusinessObject Constructor должен принимать два параметра. BusinessObject(int id, string name)

Пожалуйста, взгляните на следующую ссылку , например, на Linq to XML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...