Как получить узел по имени? - PullRequest
2 голосов
/ 18 апреля 2011

Это простая задача, но я не могу заставить ее работать.Учитывая следующий XML:

<?xml version="1.0" encoding="UTF-8"?>
<product>
    <item1></item1>
    <item2></item2>
    <item3></item3>
</product>

Я бы хотел получить все узлы в пределах product.После двух попыток не возвращаются ни одного узла, я не понимаю, почему:

XDocument meteoDoc = XDocument.Load("data.xml");
foreach (var item in meteoDoc.Descendants("product")) {//...}
foreach (var item in meteoDoc.Descendants().Where(x => x.Name == "product").Nodes()) {//...}

Следующее, как и ожидалось, вернуло бы мне все узлы:

foreach (var item in meteoDoc.DescendantNodes()) { //...}

Thx для любых подсказокне вижу проблемы ...: - /

Ответы [ 4 ]

4 голосов
/ 18 апреля 2011

Ваша первая попытка запросить все Descendants , называемые product.Ваша вторая попытка найти прямые дочерние узлы всех потомков с именем product.

Возможно, он ищет потомков в корневом элементе ... если вы знаете, что корневой элементназывается product, вы можете просто использовать:

foreach (var item in meteoDoc.Root.Descendants())

(я не могу проверить ваш существующий код, чтобы понять, почему он сейчас не работает для вас, я боюсь.)

Обратите внимание, что Descendants найдет только потомки элементов - если вы хотите, чтобы все потомки узлов , вам нужен метод DescendantNodes.

1 голос
/ 18 апреля 2011

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

XDocument meteoDoc = XDocument.Load("data.xml");
foreach (var item in meteoDoc.Root.Descendants())
{
    // ...
}
0 голосов
/ 18 апреля 2011

Я внес несколько изменений в xml, таким образом, данные более правильно сформированы, и я могу дать вам кусок кода, который выполнит вашу задачу.

static void Main(string[] args)
    {

        //Data.xml
        /*
        <?xml version="1.0" encoding="UTF-8"?>
            <product>
                <item>
                    <name>test</name>
                </item>
                <item>
                    <name>test2</name>
                </item>
                <item>
                    <name>test3</name>
                </item>
            </product>
         */


        XDocument meteoDoc = XDocument.Load("data.xml");

        var result = from c in meteoDoc.Descendants("item")
                     select new { Name = c.Element("name").Value };

        foreach (var item in result)
        {
            Console.WriteLine(item.Name);
        }
0 голосов
/ 18 апреля 2011

Попробуйте это:

        foreach (var item in meteoDoc.Descendants("product"))
        {
            foreach (var prod in item.Descendants())
            {
                // do something
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...