【问题标题】:C# Parse the following XML, not sure howC#解析以下XML,不知道如何
【发布时间】:2012-10-02 09:21:43
【问题描述】:

我有以下 XML 示例:

string xml =
@"<plist version='1.0'>
    <dict>
        <key>DataType</key>
        <string>Employee</string>
        <key>8000</key>
        <dict>
            <key>Id</key>
            <string>8000</string>
            <key>Prename</key>
            <string>Walter</string>
            <key>Name</key>
            <string>Walter Lohner Stans</string>
            <key>Initials</key>
            <string>MAL</string>
        </dict>
        <key>8001</key>
        <dict>
            <key>Id</key>
            <string>8001</string>
            <key>Prename</key>
            <string>Motorrad</string>
            <key>Name</key>
            <string> Meierskappel</string>
            <key>Initials</key>
            <string>MAM</string>
        </dict>
        <key>8004</key>
        <dict>
            <key>Id</key>
            <string>8004</string>
            <key>Prename</key>
            <string>Hanspeter</string>
            <key>Name</key>
            <string>Altenbürger AG  Horgen</string>
            <key>Initials</key>
            <string>FH</string>
        </dict>
    </dict>
</plist>";

我想将这 3 名员工作为一个列表...

还定义了Class Employee:

//Class
public class Employee
{
    //Properties    
    public string Id { get; set; }
    public string Prename { get; set; }
    public string Name { get; set; }
    public string Initials { get; set; }
}

如果我现在想将 xml 传递给一个方法并希望有一个包含这 3 个员工的列表(员工类型),那么现在解析如何工作?

我开始做这样的事情:

public List<Employee> GetEmployees(string xml)
{
    using (XmlReader reader = XmlReader.Create(new StringReader(xml)))
    {

    }
}

但实际上我不知道如何遍历所有这些描述一名员工以及一般如何处理的“字典”。我们将不胜感激。

【问题讨论】:

    标签: c# xml parsing xmlreader


    【解决方案1】:

    听起来你可以通过使用Deserialize() 方法从XmlSerializer 中受益。

    以下是一些显示示例的链接:

    C# - How to xml deserialize object itself?

    C# Deserialize XML to object

    我认为这是一种可行的方法,否则您可以将其解析为 XDocumentXmlDocument 并使用 XPath 浏览文档。顺便说一句,您可以使用XmlDocument 上的Load() 方法来加载XML 字符串

        string xmlString = "<root><sub></sub></root>";
        XmlDocument doc = new XmlDocument();
        doc.Load(xmlString);
    

    XDocumentParse() 方法将XML 字符串加载到对象中。

    string str =
        @"<Root>
            <Child>Content</Child>
        </Root>";
        XDocument doc = XDocument.Parse(str);
    

    不确定要使用哪种技术,请看这里:

    XDocument or XmlDocument

    我什至设法从 Google 中找到了一个可以帮助您入门的示例:http://www.codeproject.com/Articles/169598/Parse-XML-Documents-by-XMLDocument-and-XDocument

    另一种方法是使用 Linq2Xml 技术,这里还有另一个问题,它将向您展示它是如何实现的:

    Reading Xml with XmlReader in C#

    这是答案所依据的博客文章:

    http://blogs.msdn.com/b/xmlteam/archive/2007/03/24/streaming-with-linq-to-xml-part-2.aspx

    【讨论】:

    • 谢谢!非常有用,它使这个问题变得更加有趣,因为我以后可以将其用作参考!我现在用@Anirudha 的方法解决了它:LINQ2XML,非常好的解决方案
    【解决方案2】:

    使用 LINQ2XML..它是 COOL

    XElement doc=XElement.Parse(".......");
    
    var yourList=doc.Descendants("dict").Descendants("dict").Select(
    x=>new Employee
    {
    Id=x.Elements("string").ElementAt(0).Value,
    Prename=x.Elements("string").ElementAt(1).Value,
    Name=x.Elements("string").ElementAt(2).Value,
    Initials=x.Elements("string").ElementAt(3).Value
    }
    );
    

    【讨论】:

    • 谢谢你的答案,好方法,不知道!你应该改变两件事,使用:XElement doc = XElement.Parse(xml);(我没有文件)第二个,在元素中使用字符串,而不是键
    • "yourList" 必须是 var,你不能做 List,它会报错。演员也是不可能的。这就是我编辑您的代码的原因,导致它无法正常工作,就像它一样
    【解决方案3】:

    我建议你这样做对你有用。

    string xmlpath = "D:\new\test.xml";   
    
    XmlDocument doc = new XmlDocument();
    doc.Load(xmlpath);
    XmlElement root = doc.DocumentElement;
    XmlNodeList employ = root.GetElementsByTagName("Employee");
    list<employee> employees=new <employee>();
    
    foreach (XmlElement emp in employ)
    {
        string id = emp.GetAttribute("id");
        string name = emp.GetAttribute("name");
        string desc = emp.GetAttribute("Prename");
    
        Employee e=new employee();
        e.id=id;
        e.Prename =desc;
        e.Name=name;
       employees.add(e);
    }
    

    【讨论】:

    • 感谢答案,但有两件事我不喜欢。第一个:我将 XML 作为字符串,而不是作为文档,所以我不能使用 XMLDocument 类。第二个:您似乎没有遍历所有员工,您只得到第一个。
    【解决方案4】:

    尝试使用这样的东西:

    XmlDocument x=new XmlDocument();
    x.LoadXml(xml);
    
    foreach (XmlNode x1 in x.SelectNodes("//dict"))
    {
        string Id=x1.SelectSingleNode("dict[key[text()='Id']]/string").InnerText;
    }
    

    【讨论】:

      猜你喜欢
      • 2016-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-26
      • 1970-01-01
      相关资源
      最近更新 更多