【问题标题】:C# XmlReader, sequence problemsC# XmlReader,序列问题
【发布时间】:2014-04-28 14:41:37
【问题描述】:

这可能很菜鸟,但我遇到了一些最简单的问题。这是我的 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);
            }
        }

所以,对于第一个选项,我应该得到一个键值对

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

提前谢谢!

/snedker

【问题讨论】:

  • 使用XmlReader吗?如果您可以改用 LINQ to XML,它可能会让您的生活更简单。
  • PS:也尝试了 while (reader.ReadToFollowing("Option")) 没有运气。
  • 嗨乔恩,我可以做很多事情来完成这项工作。解析外部 xml、xpath...等等。但现在我真的很想让这个读者工作。只是因为。 :-)
  • 您是否尝试过读取内部XML之前读取属性值?

标签: c# xml sequence xmlreader


【解决方案1】:

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

试试这个代码 sn-p 代替。 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);
    }
}

【讨论】:

  • 效果很好。我只是错过了每次阅读实际上都会执行阅读器指针的移动。所以我错过了一个节拍。谢谢。
【解决方案2】:

您可以使用LINQ to XML

var xmlDocument = XDocument.Load("path");

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

【讨论】:

  • 感谢您的意见。必须承认它很短! :) 问候 /Snedker
  • @MortenSnedker 这就是 LINQ to XML 的美妙之处 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多