【问题标题】:Skip wrapping elements when deserializing XML with C# / .NET使用 C# / .NET 反序列化 XML 时跳过包装元素
【发布时间】:2015-06-03 19:23:58
【问题描述】:

我正在尝试使用以标记为XmlRoot 的类开头并包含具有所需属性的类和成员的类层次结构,使用 C#/.NET 3.5 反序列化传入的 XML 数据。到目前为止,这有效。

现在我遇到的输入数据大致如下:

<?xml version="1.0" encoding="UTF-8"?>
<ns1:foo xmlns:ns1="http://some.name/space">
  <ns1:bar>
    <payload interesting="true">
      <stuff type="interesting"/>
    </payload>
  </ns1:bar>
</ns1:foo>

最外面的两个元素 - ns1:foons1:bar - 是我无法控制的远程系统中的序列化过程的结果。它们总是存在于完全相同的星座中,并且毫无意义。

按照我目前的方法,我可以编写一个引用 class Barclass Foo,而 class Bar 又引用 class Payload。但是,由于我对 foobar 元素不感兴趣,有没有办法在反序列化期间跳过它们并让反序列化器只返回有效负载?如果不是:是否可以使用XmlRoot(ElementName = "foo", Namespace = "http://some.name/space") 属性创建class FooPayload,然后以某种方式跳过barpayload 级别,以便FooPayload 类直接包含名为InterestingStuff 的属性?

【问题讨论】:

  • 您是否考虑过首先在 XML 上使用 LINQ (msdn.microsoft.com/en-us/library/bb943906.aspx),然后再序列化该对象?
  • @Ruskin:不,还没有 - 从 .NET 3.5 开始,这项技术是否可用?
  • @vwegerl:是的,它已经有一段时间了。您肯定会发现修剪原始 XML 然后在其上运行标准序列化程序很有用。虽然我不知道性能。 (注意:我不愿意写解决方案:))

标签: c# .net xml deserialization xml-deserialization


【解决方案1】:

我修改了您的 XML 以纠正错误。请参阅下面有趣的解决方案。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
using System.IO;
using System.Text.RegularExpressions;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string input =
                "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
                "<ns1:foo xmlns:ns1=\"http://some.name/space\">" +
                  "<ns1:bar>" +
                    "<ns1:payload interesting=\"true\">" +
                      "<ns1:stuff type=\"interesting\"/>" +
                    "</ns1:payload>" +
                  "</ns1:bar>" +
                "</ns1:foo>";

            //remove prefix
            string pattern = "(</?)([^:]*:)";
            Regex expr = new Regex(pattern);
            input = expr.Replace(input, "$1");

            XmlSerializer xs = new XmlSerializer(typeof(Foo));
            StringReader s_reader = new StringReader(input);
            XmlTextReader reader = new XmlTextReader(s_reader);
            Foo  foo = (Foo)xs.Deserialize(reader);
            foo.GetStuff();
        }
    }
    [XmlRoot(ElementName = "foo")]
    public class Foo
    {
        [XmlElement("bar")]
        public Bar bar { get; set; }

        private Boolean interesting;
        private string type;

        public void GetStuff()
        {
            interesting = bar.payload.interesting;
            type = bar.payload.stuff.type;
        }

    }
    [XmlRoot("bar")]
    public class Bar
    {
        [XmlElement("payload")]
        public Payload payload { get; set; }
    }
    [XmlRoot("payload")]
    public class Payload
    {
        [XmlAttribute("interesting")]
        public Boolean interesting { get; set; }
        [XmlElement("stuff")]
        public Stuff stuff { get; set; }
    }
    [XmlRoot("stuff")]
    public class Stuff
    {
        [XmlAttribute("type")]
        public string type { get; set; }
    }
}
​

【讨论】:

  • XML 完全按照所示到达,包含合格和不合格的元素。否则,这正是我所描述的(“我可以写......”),通过正则表达式处理一些不必要且潜在危险的原始 XML。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-22
  • 2016-10-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多