在.NET应用程序中传递XML的最佳方法是什么?

时间:2009-06-04 08:49:48

标签: c# xml

我有以下带有“page”节点的XML文件,我想在我的应用程序中读入“PageItem”对象。我保存的大多数XML节点都是string / int / DataTime属性,工作正常。

但是将“内容”节点的XML子节点存储在PageItem对象的属性中的最佳方法是什么,以便我可以稍后在应用程序中解析它?我应该将其存储为字符串,然后将字符串作为XML读入,还是有更有效的方法将XML子节点存储为属性?

<?xml version="1.0" encoding="utf-8" ?>
<pages>
    <page>
        <id>1</id>
        <whenCreated>2007-01-19T00:00:00</whenCreated>
        <itemOwner>edward</itemOwner>
        <publishStatus>published</publishStatus>
        <correctionOfId>0</correctionOfId>
        <idCode>contactData</idCode>
        <menu>mainMenu</menu>
        <title>Contact Data</title>
        <description>This is contact data page.</description>
        <accessGroups>loggedInUsers,loggedOutUsers</accessGroups>
        <displayOrder>10</displayOrder>
        <content>
            <form idcode="customers" query="limit 5; category=internal"/>
            <form idcode="customersDetail" query="limit 10; category=internal"/>
        </content>
    </page>
    <page>
        <id>2</id>
        <whenCreated>2007-01-29T00:00:00</whenCreated>
        <itemOwner>edward</itemOwner>
    ...

我将此XML文件读入 PageItem 对象:

public class PageItem : Item
{
    public string IdCode { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public string Menu { get; set; }
    public string AccessGroups { get; set; }
    public int DisplayOrder { get; set; }
    public List<XmlNode> Content { get; set; }  //PSEUDO-CODE

使用此代码:

var pageItems = from pageItem in xmlDoc.Descendants("page")
    orderby (int)pageItem.Element("displayOrder")
    select new Models.PageItem
    {
        Id = (int)pageItem.Element("id"),
        WhenCreated = (DateTime)pageItem.Element("whenCreated"),
        ItemOwner = pageItem.Element("itemOwner").Value,
        PublishStatus = pageItem.Element("publishStatus").Value,
        CorrectionOfId = (int)pageItem.Element("correctionOfId"),
        IdCode = pageItem.Element("idCode").Value,
        Menu = pageItem.Element("menu").Value,
        Title = pageItem.Element("title").Value,
        Description = pageItem.Element("description").Value,
        AccessGroups = pageItem.Element("accessGroups").Value,
        DisplayOrder = (int)pageItem.Element("displayOrder"),
        Content = pageItem.Element("content").DescendantNodes() //PSEUDO-CODE
    };

4 个答案:

答案 0 :(得分:4)

你试过XmlSerializer吗?

            public string Serialize(PageItem obj)
            {

                XmlSerializer formatter = new XmlSerializer(typeof(PageItem));

                MemoryStream ms = new MemoryStream();

                formatter.Serialize(ms, obj);

                ms.Position = 0;
                StreamReader sr = new StreamReader(ms);

                return sr.ReadToEnd();
            }

            public PageItem  Deserialize(string serializedObject)
            {

                XmlSerializer formatter = new XmlSerializer(typeof(PageItem));

                MemoryStream ms = serializedObject.ToMemoryStreamFromUTF8();

                return ((PageItem)formatter.Deserialize(ms));
            }

答案 1 :(得分:2)

使用此属性: -

 public XElement Content { get; set; }  //PSEUDO-CODE

并像这样分配: -

 Content = pageItem.Element("content")

答案 2 :(得分:1)

这取决于你的效率:你想要降落的空间/时间权衡的哪一方?如果您对保存内存最感兴趣,则将内容存储为字符串并根据需要进行解析可能是最有效的。但是,如果您要经常访问内容并希望访问速度很快,您可能希望将其存储为XElement对象列表(假设您使用的是.Net 3.5,您的示例表明您正在使用。)

答案 3 :(得分:0)

假设您的应用程序只需要将内容视为一团数据(将其传递到另一层进行渲染),只需将其编码为base64字符串即可。几乎所有语言都有base64编码库。例如,如果这是一个Web应用程序,您可以将字符串传递给JavasSript并让它解码并呈现内容或在服务器端执行。