【问题标题】:Parsing XML in Compact Framework 3.5在 Compact Framework 3.5 中解析 XML
【发布时间】:2013-12-13 18:11:40
【问题描述】:

我有一个需要解析的以下 XML,但我遇到了一些问题。首先,我在 Class 标签中拥有的标签数量是未知的,而且它们并不明显(所以我不能用它们的名字来指定它们)。

XML 示例:

<Class value="1B2">
    <FirstName>Bob</FirstName>
    <FirstName>Jim</FirstName>
    <FirstName>Alice</FirstName>
    <FirstName>Jessica</FirstName>
    //(More similar lines, number is not known)
</Class>
<Class value="2C4">
    <FirstName>Bob</FirstName>
    <FirstName>Jim</FirstName>
    <FirstName>Alice</FirstName>
    <FirstName>Jessica</FirstName>
    //(More similar lines, number is not known)
</Class>

现在这是我目前解析它的代码:

定义 xmlReader 和 XElement

XmlReader xmlReader = XmlReader.Create(modFunctions.InFName);
XElement xElem = new XElement("FirstName");

然后我正在连接到 SQL Server CE 数据库,这是我读取 xmlfile 的主循环:

while (xmlReader.Read())
{
    if (xmlReader.NodeType == XmlNodeType.Element &&
        (xmlReader.LocalName == "Class" || xmlReader.LocalName == "FirstName") &&
        xmlReader.IsStartElement() == true)
    {
        // Find Class tag
        if (xmlReader.LocalName == "Class")
        {
            xElem = (XElement)XNode.ReadFrom(xmlReader);
            // Get 1B2 value
            HRName = xElem.FirstAttribute.Value;

            // Tried to read each node in xElement to get FirstName values.. this didn't work
            for ( (XNode e in (XNode)xElem)
            {
                string newString = ((string)xElem.Element("FirstName"));
            }

        }

        // Also tried this before, but it is skips it since FirstName tags are inside Class tag. 
        if (xmlReader.LocalName == "FirstName")
        {
            xElem = (XElement)XNode.ReadFrom(xmlReader);
            record.SetValue(0, xElem.Value);
            record.SetValue(1, HRName);
            rs.Insert(record);
        }
    }
}

在我的表中(我试图写这个的地方)包含两列(名字和类)

【问题讨论】:

  • 查看 linq-to-xml。

标签: c# xml xml-parsing sql-server-ce


【解决方案1】:

正如 cmets 中所述,Linq to Xml 是您最好的选择:http://msdn.microsoft.com/en-us/library/system.xml.linq(v=vs.90).aspx

你的解析应该是这样的:

        string xml = "<root><Class value='1B2'><FirstName>Bob</FirstName><FirstName>Jim</FirstName><FirstName>Alice</FirstName><FirstName>Jessica</FirstName></Class>" +
                     "<Class value='2C4'><FirstName>Bob</FirstName><FirstName>Jim</FirstName><FirstName>Alice</FirstName><FirstName>Jessica</FirstName></Class></root>";
        XDocument doc = XDocument.Parse(xml);
        foreach(var node in doc.Descendants("Class"))
        {
            var cls = node.Attribute("value").Value;
            string[] firstNames = node.Descendants("FirstName").Select(o => o.Value).ToArray();
        }

【讨论】: