C#XmlReader,序列问题

时间:2014-04-28 14:41:38

标签: c# xml sequence xmlreader

这可能是相当的菜鸟,但我遇到的问题最简单。这是我的xml:

<CustomFieldOptions>
<DataType>Text</DataType>
<Options>
    <Option Key="Advokater">category_advokater</Option>
    <Option Key="Arkitektur- &amp; ingeniørvirksomheder">category_arkitektur</Option>
    <Option Key="Bank &amp; finans">category_bank</Option>
</Options>

我正在尝试将节点值和键属性添加到列表中,例如:

using (XmlReader reader = XmlReader.Create(new StringReader(xml)))
        {
            while(reader.Read())
            {
                reader.ReadToFollowing("Option");
                key = reader.ReadInnerXml();
                reader.MoveToFirstAttribute();
                value = reader.Value;

                if(key.Length > 0 && value.Length > 0)
                    categoryList.Add(key, value);
            }
        }

所以,对于第一个选项,我应该得到一个键值对&lt;“category_advokater”,“Advokater”&gt;

但是当添加到列表时,我有当前/前一行的混合值。我哪里出错?

提前谢谢!

/ snedker

2 个答案:

答案 0 :(得分:1)

Reader速度更快,允许您部分处理xml文件。

请尝试使用此代码段。 ReadInnerXml将读指针前进到下一个元素。如果你没有跳过while语句中的下一个读取,你最终会无意中跳过一个元素。

using (XmlReader reader = XmlReader.Create(new StringReader(text))) {
bool skipRead = false;
while (skipRead || reader.Read()) {
    skipRead = false;
    if (reader.NodeType == XmlNodeType.Element && reader.Name == "Option") {
        string key = reader.GetAttribute("Key");
        string value = reader.ReadInnerXml();
        skipRead = true;
        Console.WriteLine("{0}.{1}", key, value);
    }
}

答案 1 :(得分:0)

您可以使用LINQ to XML

执行此操作
var xmlDocument = XDocument.Load("path");

var options = xmlDocument.Descendants("Option")
            .ToDictionary(x => (string)x, x => (string)x.Attribute("Key"));