Как загрузить XML в работающий объект из строки фрагмента? - PullRequest
2 голосов
/ 23 апреля 2010

У меня есть фрагмент XML (всего несколько узлов, а не полный документ XML) в строке, из которой мне нужно получить некоторые значения с помощью Linq to XML.Я нахожу довольно сложным преобразовать эту строку в объект XML, с которым я могу работать.

Есть ли способ сделать это для меня?

Это примерXML:

<Batch type="My Funds" pageNumber="69">
  <FundGroup heading="Best Funds Ever">
    <fund id="367"/>
    <fund id="373"/>
    <fund id="378"/>
  </FundGroup>
  <FundGroup heading="Almost Best Funds">
    <fund id="665"/>
    <fund id="666"/>
    <fund id="667"/>
  </FundGroup>
</Batch>

Ответы [ 3 ]

2 голосов
/ 23 апреля 2010

xml не поврежден, поэтому любая xml-модель должна работать.XmlSerializer должно быть хорошо, например;а как насчет специальной модели анонимных типов?

        var doc = XElement.Parse(xml);
        var batch = new {
            Type = (string)doc.Attribute("type"),
            Page = (int)doc.Attribute("pageNumber"),
            Groups = (from fg in doc.Elements("FundGroup")
                      select new {
                          Heading = fg.Attribute("heading"),
                          Funds = (from fund in fg.Elements("fund")
                                   select (int)fund.Attribute("id")).ToList()
                      }).ToList()
        };

Теперь рассмотрим batch; -p

1 голос
/ 23 апреля 2010

Вы должны быть в состоянии сделать это.Если имеется несколько элементов пакета, и вы включили в свой фрагмент только один, вам нужно будет обернуть весь фрагмент в корень, возможно, <Batches> {xml} </Batches>, чтобы вы могли работать с ним.Если да, то где я говорю

var query = from batch in document.Elements("Batch") ...

Измените это на

... document.Root.Elements("Batch") or document.Descendants("Batch")

Код:

string xml = @"<Batch type=""My Funds"" pageNumber=""69""> 
                    <FundGroup heading=""Best Funds Ever""> 
                    <fund id=""367""/> 
                    <fund id=""373""/> 
                    <fund id=""378""/> 
                    </FundGroup> 
                    <FundGroup heading=""Almost Best Funds""> 
                    <fund id=""665""/> 
                    <fund id=""666""/> 
                    <fund id=""667""/> 
                    </FundGroup> 
                </Batch>";

XDocument document = XDocument.Parse(xml);

var query = from batch in document.Elements("Batch")
            select new
            {
                Type = batch.Attribute("type").Value,
                PageNumber = (int)batch.Attribute("pageNumber"),
                FundGroups = from fundGroup in batch.Elements("FundGroup")
                                select new
                                {
                                    Heading = fundGroup.Attribute("heading").Value,
                                    Funds = from fund in fundGroup.Elements("fund")
                                            select new { Id = (int)fund.Attribute("id") }
                                }
            };
0 голосов
/ 23 апреля 2010

Пока у вас есть целые узлы, вы можете просто обернуть строку в один тег элемента и загрузить его.

"" + myFragment + "";

...