使用C#处理XML中根节点内的根节点

时间:2014-05-27 20:19:49

标签: c# xml xml-parsing

对不起这个可怕的头衔,我不确定正确的措辞是什么。

我一直在用这段代码来解析一些XML:

[Serializable()]
public class Report
{
    [XmlElement("AttachedFiles")]
    public AttachedFiles attachedFiles;

    public Report()
    {
        attachedFiles = null;
    }
}

[Serializable()]
[XmlRoot("nodes")]
public class ReportList
{
    [XmlElement("node", typeof(Report))]
    public Report[] reportList;
}

[Serializable()]
[XmlRoot("AttachedFiles")]
public class AttachedFiles
{
    [XmlElement("AttachedFile")]
    public List<string> attachedFiles;
}

XML看起来像这样:

<nodes>
    <node>
        <AttachedFiles>
            <AttachedFile>File1</AttachedFile>
            <AttachedFile>File2</AttachedFile>
        </AttachedFiles>
    </node>
</nodes>

我遇到的问题是,最终我必须致电Report.attachedFiles.attachedFiles才能获得列表。我有办法只拨打Report.attachedFiles并获取列表吗?我知道这是一个非常小的问题,但它很烦人。

修改

这是@xDaevax帮助后代码的样子。

[Serializable()]
public class Report
{
    [XmlArray(ElementName = "AttachedFiles"), XmlArrayItem(ElementName = "AttachedFile")]
    public List<string> AttachedFiles;

    public Report()
    {
        attachedFiles = null;
    }
}

[Serializable()]
[XmlRoot("nodes")]
public class ReportList
{
    [XmlElement("node", typeof(Report))]
    public Report[] reportList;
}

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

这是我想出的(虽然我没有你的JiraReport课程。)

[Serializable()]
public class Report {

    [XmlIgnore()]
    private AttachedFiles _attachedFiles;
    public Report() {
            attachedFiles = null;
    } // end constructor

    [XmlArray(ElementName = "AttachedFiles"), XmlArrayItem(ElementName = "AttachedFile")]
    public AttachedFiles Files {
            get { return _attachedFiles; }
            set { _attachedFiles = value; }
    } // end property Files

} // end class Report

[Serializable()]
[XmlRoot("ReportList")]
public class ReportList {

    [XmlIgnore()]
    private Report[] _reports;

    public ReportList() {
        _reports = null;
    } // end constructor

    [XmlArray(ElementName = "nodes"), XmlArrayItem(ElementName = "node")]
    public Report[] Reports {
            get { return _reports; }
            set { _reports = value; }
    } // end property Reports

} // end class ReportList

[Serializable()]
public class AttachedFiles : List<string> {

} // end class AttachedFiles

在集合属性上使用XmlArray和ArrayItem可简化属性使用并使代码更易于阅读。此外,因为AttachedFiles类继承了字符串列表,所以它会从对象图中删除一定深度,因此调用不再冗余。您还可以在ReportList类上添加一个函数,该函数循环并返回所有报告的所有附加文件(函数不会被XmlSerializer序列化)。

编辑:以下是一些解释功能用法的MSDN文档:

http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlarrayitemattribute(v=vs.100).aspx 另外,请参阅BlackWasp这篇文章,该文章介绍了涉及数组的XML序列化。 http://www.blackwasp.co.uk/xmlarrays.aspx