用c#处理XML中根节点中的根节点

本文关键字:根节点 XML 处理 | 更新日期: 2023-09-27 18:05:30

很抱歉,我不知道什么是合适的措辞。

我一直在使用这段代码来解析一些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;
}

谢谢你的帮助!

用c#处理XML中根节点中的根节点

这是我想到的(虽然我没有你的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

相关文章: