【问题标题】:Deserialize plain xml反序列化纯xml
【发布时间】:2014-10-24 17:04:22
【问题描述】:

我需要反序列化纯xml,没有命名空间和根元素,例如:

    <element name="1">
       <subelement1>2</subelement/>
    </element>
    <element name="2">
     <subelement1>3</subelement/>
    </element>

如何使用 XmlSerializer 做到这一点?我有 XmlDataset,它是由 xsd.exe 生成的。但是当我使用代码时,我看到 InvalidOperationException 带有消息“ not expected”

【问题讨论】:

  • 那根本就不是一个有效的xml文档(多个根节点是不合法的); XmlSerializer 不会喜欢这样。然而,其余的都是微不足道的,应该可以与 [XmlRoot("element")] 一起正常工作
  • 我同意。如果您希望 XMLSerializer 使用它,您需要有有效的 XML。只需创建一个带有根节点的新 XML 文档并将该片段添加到根节点内。现在它是有效的 XML。

标签: c# xml serialization


【解决方案1】:

如下所示。要点:

  • 您需要手动控制阅读器将一致性级别设置为“片段”,以允许多个根节点
  • 您需要为每个根节点获取一个子树阅读器,以供 XmlSerializer 使用

代码:

using System;
using System.IO;
using System.Xml;
using System.Xml.Serialization;

[XmlRoot("element")]
public class MyElement
{
    [XmlAttribute("name")]
    public string Name { get; set; }

    [XmlElement("subelement1")]
    public string Value { get; set; }

}
public static class Program
{
    static void Main()
    {
        var xml = @"
<element name=""1"">
    <subelement1>2</subelement1>
</element>
<element name=""2"">
    <subelement1>3</subelement1>
</element>";
        var ser = new XmlSerializer(typeof(MyElement));
        using (var sr = new StringReader(xml))
        using (var xr = XmlReader.Create(sr, new XmlReaderSettings
        {
            IgnoreWhitespace = true,
            ConformanceLevel = System.Xml.ConformanceLevel.Fragment
        }))
        {
            while (xr.MoveToContent() == XmlNodeType.Element)
            {
                using (var subtree = xr.ReadSubtree())
                {
                    var obj = (MyElement)ser.Deserialize(subtree);
                    Console.WriteLine("{0}: {1}",
                        obj.Name, obj.Value);
                }
                xr.Read();
            }
        }
    }

}

【讨论】:

    【解决方案2】:

    This SO 问题可能会有所帮助。它涉及使用dynamic,而不是您提到的xsd。

    至于InvalidOperationException 问题,您能否发布一个简单的、完整 产生错误的 XML 示例?这将有助于识别问题。

    【讨论】:

      猜你喜欢
      • 2012-03-04
      • 2011-03-03
      • 1970-01-01
      • 1970-01-01
      • 2011-05-12
      相关资源
      最近更新 更多