【问题标题】:C# Deserialization of XML into Array With Sibling NodesC# 将 XML 反序列化为具有兄弟节点的数组
【发布时间】:2011-10-26 17:02:31
【问题描述】:

在我正在处理的一个项目中,我获得了 XML 来处理我无法控制的问题。我需要提取一个节点数组以及作为数组兄弟的奇异属性。 (请参阅下面的示例 XML)

<pagination>
    <total-pages>1</total-pages>
    <page position="first">?i=1;q=gloves</page>
    <page position="last">?i=1;q=gloves</page>
    <page position="1" selected="true">?i=1;q=gloves</page>      
</pagination>

在上面的示例中,我需要将 total-pages 节点提取为 int 并创建一个页面节点数组。我有反序列化器工作的基础知识我只需要知道如何设置我的类以允许我拉出数组和 int。如果我在主课中执行以下操作:

[XmlArray("pagination")]
[XmlArrayItem("page", typeof(ResultsPage))]
public ResultsPage[] Pages { get; set; }
[XmlElement(ElementName = "total-pages")]
public int TotalPages { get; set; }

我得到了页面节点的数组,但是 TotalPages 是 0 而不是 1。我还在我的主类中尝试了以下内容:

[XmlElement(ElementName = "pagination")]
public Pagination Pagination { get; set; }

有一个子类

public class Pagination
{
    [XmlArray]
    [XmlArrayItem("page", typeof(ResultsPage))]
    public ResultsPage[] Pages { get; set; }
    [XmlElement(ElementName = "total-pages")]
    public int TotalPages { get; set; }
}

在这种情况下,TotalPages 正确设置为 1,但 Pages 数组为空。

有没有办法做到这一点?

【问题讨论】:

标签: c# xml xml-deserialization


【解决方案1】:

这应该可以工作

public class Pagination
{
    [XmlElement("page")]
    public List<ResultsPage> Pages { get; set; }
    [XmlElement("total-pages")]
    public int TotalPages { get; set; }
}

public class ResultsPage
{
    [XmlAttribute("position")]
    public string Position;

    [XmlText]
    public string Text;
}

如果你有一个想要展平的容器元素,你只需要使用 XmlArray 和 XmlArrayItem 属性。即

<pagination>
    <total-pages>1</total-pages>
    <pages>
        <page position="first">?i=1;q=gloves</page>
        <page position="last">?i=1;q=gloves</page>
        <page position="1" selected="true">?i=1;q=gloves</page>      
    </pages>
</pagination>

那你就写

public class Pagination
{
    [XmlArray("pages"), XmlArrayItem("page")]
    public List<ResultsPage> Pages { get; set; }
    [XmlElement("total-pages")]
    public int TotalPages { get; set; }
}

【讨论】:

  • @CynergyDigital 但它改变了你的 xml,就像我在我的示例中建议的那样。这个变化和我的略有不同,但它是一个变化!在您对我的解决方案的评论中,您说您对 xml 没有影响,因为它来自第 3 方...
  • @Fischermaen 不,我对您的回答投了反对票,因为这完全是错误的。我的答案中的 XML 与解决方案无关。这只是一个例子来说明他需要使用 XmlArray 属性的情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-18
  • 1970-01-01
相关资源
最近更新 更多