1

我有以下 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)))
    {

    }
}

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

4

4 回答 4

2

XmlSerializer这听起来有点像您可以通过使用该Deserialize()方法受益。

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

C# - 如何 xml 反序列化对象本身?

C# 将 XML 反序列化为对象

我认为这是一种可能的方式,否则您可以将其解析为XDocumentXmlDocument使用 XPath 浏览文档。顺便说一下,你可以使用Load()on 方法XmlDocument来加载一串 XML

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

或将一串 XML 加载到对象中的Parse()方法。XDocument

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

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

XDocument 或 XmlDocument

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

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

在 C# 中使用 XmlReader 读取 Xml

这是答案所基于的博客文章:

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

于 2012-10-02T09:32:48.160 回答
1

我建议你这样的东西对你有用。

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);
}
于 2012-10-02T09:33:37.970 回答
1

使用 LINQ2XML ..很酷

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
}
);
于 2012-10-02T09:38:48.073 回答
0

尝试使用这样的东西:

XmlDocument x=new XmlDocument();
x.LoadXml(xml);

foreach (XmlNode x1 in x.SelectNodes("//dict"))
{
    string Id=x1.SelectSingleNode("dict[key[text()='Id']]/string").InnerText;
}
于 2012-10-02T09:38:19.993 回答