我有以下带有“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
};
答案 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并让它解码并呈现内容或在服务器端执行。