Синтаксический анализ XML - Неправильный путь - PullRequest
0 голосов
/ 01 декабря 2011

У меня есть этот XML, который должен быть проанализирован

<category id="1">
    <title>Environment & Heritage</title>
    <subcategories>
        <subcategory id="2">Trees & Green Cover</subcategory>
        <subcategory id="3">Noise Pollution</subcategory>
        <subcategory id="4">Air Pollution</subcategory>
        <subcategory id="5">Water Pollution</subcategory>
</category>
<category id="72">
    <title>Environment and Heritage</title>
    <subcategories/>
</category>
<category id="7">
    <title>Health & Sanitation</title>
    <subcategories><subcategory id="8">Drains & Sewerage</subcategory>
    <subcategory id="9">Solid Waste Management</subcategory>
    </subcategories>
</category>

Класс

public class Categories
{
    public string Id { get; set; }
    public string Title { get; set; }
    public List<Categories> subCategories { get; set; }

    public Categories() { }

    public Categories(string value, string text)
    {
        this.Id = value;
        this.Title = text;
    }
}

У нас есть список объектов этого класса List

эта функциявыполняет основную работу

List<Categories> FillObjectFromXML(string xmString)
    {
        //Declaration
        XDocument xmlDoc = XDocument.Load(new StringReader(xmString));
        List<Categories> categoriesList = new List<Categories>();
        Categories catItem;// = new Categories();
        Categories subItem;
        List<Categories> subCategoriesList;// = new List<Categories>();

        //Coding
        var lv1s = from lv1 in xmlDoc.Descendants("category")
                   select new
                   {
                       Id = lv1.Attribute("id").Value,
                       Header = lv1.Descendants("title"),
                       Children = lv1.Descendants("subcategories")
                   };

        //Loop through results
        foreach (var lv1 in lv1s)
        {
            catItem = new Categories();
            catItem.Id = lv1.Id;
            catItem.Title = lv1.Header.First().Value;
            subCategoriesList = new List<Categories>();
            foreach (var lv2 in lv1.Children) 
            {
                subItem=new Categories();
                subItem.Id=lv2.Attribute("id").Value;
                subItem.Title=lv2.Descendants("title").ToString();
                subCategoriesList.Add(subItem);
            }
            catItem.subCategories = subCategoriesList;
            categoriesList.Add(catItem);
        }


        //End
        return categoriesList;
    }

цикл foreach для lv2 не дает правильных результатов

Ответы [ 2 ]

2 голосов
/ 01 декабря 2011

В приведенном выше методе я считаю, что вам нужно изменить строку:

Children = lv1.Descendants("subcategories")

на:

Children = lv1.Descendants("subcategory")

Если вам нравится XPath, вы, вероятно, могли бы упростить этот код.

Категории первого уровня:

XmlNodeList categories = xmlDoc.SelectNodes("//category"); //assumes there is only one tier of categories.

Затем вы можете приступить к каждой из категорий:

foreach(XmlNode category in categories)
{
  XmlNodeList subcategories = category.SelectNodes("./subcategories/subcategory");
}

Таким образом, удаляя большую часть DOM-хождения, вам придется заниматься.Зависит от того, нравится ли вам XPath или нет - но он отлично подходит для этого.

1 голос
/ 01 декабря 2011

Ваш XML в настоящее время недействителен.После исправления вы ищете неправильное место при разборе вашей коллекции Children - каждый дочерний узел является subcategories узлом - хотя вы хотите, чтобы он был subcategory узлом - поэтому измените это:

Children = lv1.Descendants("subcategories")

до

Children = lv1.Descendants("subcategory")
...