Каков наилучший способ передачи XML в приложении .NET? - PullRequest
1 голос
/ 04 июня 2009

У меня есть следующий XML-файл с узлами "page" , который я хочу прочитать в объектах "PageItem" в моем приложении. Большинство узлов XML я сохраняю как свойство string / int / DataTime, которое отлично работает.

Но каков наилучший способ сохранить дочерние узлы XML узла "content" в свойстве объекта 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 ]

4 голосов
/ 04 июня 2009

Вы пробовали 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));
            }
2 голосов
/ 04 июня 2009

Используйте это свойство: -

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

и назначьте так: -

 Content = pageItem.Element("content")
1 голос
/ 04 июня 2009

Это зависит от того, что вы подразумеваете под эффективностью: какую сторону пространственно-временного компромисса вы хотите получить? Если вы больше всего заинтересованы в сохранении памяти, хранение содержимого в виде строки и разбор при необходимости, возможно, наиболее эффективно. Но если вы собираетесь часто получать доступ к контенту и хотите, чтобы доступ был быстрым, вы можете сохранить его в виде списка объектов XElement (при условии, что вы используете .Net 3.5, как показывает ваш пример).

0 голосов
/ 04 июня 2009

Предполагая, что вашему приложению просто нужно обрабатывать контент как большой блок данных (который передается на другой уровень для рендеринга), просто закодируйте его как строку base64. Существуют библиотеки кодирования base64 практически для любого языка. Например, если это веб-приложение, вы можете передать строку в JavasSript и позволить ему декодировать и визуализировать контент или делать это на стороне сервера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...