1

问题

我正在使用如下结构的 XML,并且遇到问题,因为<value>标签可以包含多种类型的数据,并且有时可以具有嵌套值。我已经尝试使用抽象类ListItem并具有几种不同类型的值,但它似乎不起作用,因为 XmlSerializer 要求我以某种方式在不同的密封类之间进行选择 - 这是我做不到的。

<listContainer>
    <listItem>
        <value>
            <boolean>true</boolean>
        </value>
    </listItem>
    <listItem>
        <value>1</value>
    </listItem>
    <listItem>
        <value>HAI IM A STRING!</value>
    </listItem>
</listContainer>

补充笔记

  1. 我还尝试编写一个 XmlReaderReader ( http://msdn.microsoft.com/en-us/library/t2abc1zd(v=vs.71).aspx ) 以尝试在可能的情况下深入嵌套标签,但这似乎并不到一个可行的解决方案。
  2. 我无法更改 XML 的格式,它来自第三方提要。
  3. XML 文件大约有几个演出。出于性能原因,我正在使用 BufferedStream 并将只转发 XmlReader 传递给默认 XmlSerializer 来执行读取/反序列化。
  4. 这不是根级别的 XML,它嵌套在其他几个节点中,但我只需要关于如何正确序列化它的建议。

代码

public class listContainer {
    [XmlArray(ElementName="listItem")]
    [XmlArrayItem(Type=typeof(listItem), ElementName="listItem")]
    public List<listItem> listItem { get; set; }
}
public class listItem {
    // ... help ...
}
4

1 回答 1

0

Xml 模式包含歧义 - 在您的示例中,HAI... 和 1 可以是相同的类型、字符串,或者 1 可以反序列化为整数。

我觉得没有简单的方法可以将这些隐式规则表达为可序列化的对象,所以我建议反序列化为XmlNode,然后根据节点属性进行人工识别。例如,如果 XmlNode 包含单个嵌套标签 - 反序列化为 bool,如果没有标签 - 尝试解析为 int,否则使用字符串等。样本非常小,因此很难判断是否会有很多规则。

我必须修改示例,在上面再包含一个根级别,才能正确反序列化。但是你说这个xml已经嵌套了,所以应该没问题。

[XmlRoot("root")]
public class container {
  [XmlArray("listContainer")]
  public List<listItem> listItem;
}

public class listItem {
    public XmlNode value;
}

class App {
  static void Main() {
    StreamReader fs = new StreamReader(@"sample.xml");
    XmlSerializer serializer = new XmlSerializer(typeof(container));
    var result = serializer.Deserialize(fs) as container;  
    foreach (var res in result.listItem)
      Console.WriteLine(res.value.OuterXml);
  }
}

示例.xml:

<root>
<listContainer>
    <listItem><value><boolean>true</boolean></value></listItem>
    <listItem><value>1</value></listItem>
    <listItem><value>HAI IM A STRING!</value></listItem>
</listContainer>
</root>
于 2013-04-23T21:10:03.290 回答