Выбор элемента XML в LINQ - PullRequest
1 голос
/ 07 февраля 2012

У меня есть XML-документ в следующем формате.

<?xml version="1.0" encoding="UTF-8" ?>

<Rows>
<Row>    
    <Field Name='PhysicalLocation'>11;#West</Field>
    <Field Name='ID'>3327</Field>
</Row>
</Rows>

И я пытаюсь сделать с ним выбор linq.

Я пробовал следующее.

XDocument xmlDoc = XDocument.Load("C:\\manifest.xml");

var query = from item in xmlDoc.Descendants("Rows").Elements()
                    select new { ID = item.Attribute("ID").Value, Value = item.Attribute("PhysicalLocation").Value };

А также

XDocument xmlDoc = XDocument.Load("C:\\manifest.xml");

var query = from item in xmlDoc.Descendants("Rows").Elements()
                    select new { ID = item.Element("ID"), Value = item.Element("PhysicalLocation") };

И в обоих случаях я, похоже, терплю неудачу.Он генерирует ожидаемое количество строк, но значения не заполняются.

Может ли кто-нибудь указать мне правильное направление?Чего мне не хватает?

Ответы [ 4 ]

1 голос
/ 07 февраля 2012

Как насчет попытки запроса, подобного этому:

var query =
    from item in xmlDoc.Descendants("Rows").Elements()
    let values = item.Elements("Field")
        .ToDictionary(x => x.Attribute("Name").Value, x => x.Value)
    select new
    {
        ID = values["ID"],
        Value = values["PhysicalLocation"],
    };
1 голос
/ 07 февраля 2012

у вас нет атрибута с именем «PhysicalLocation» или «ID». у вас есть только атрибуты с именем «Имя».

Вам нужно добавить выражение where к значению атрибута 'name', чтобы найти свой идентификатор и PhysicalLocation

0 голосов
/ 07 февраля 2012

Я думаю, что это должно сработать:

var xDoc = XDocument.Parse(
@"<?xml version='1.0' encoding='UTF-8' ?> 

<Rows> 
    <Row>     
        <Field Name='PhysicalLocation'>11;#West</Field> 
        <Field Name='ID'>3327</Field> 
    </Row> 
</Rows>");

var res = from row in xDoc.Root.Elements("Row")
          select new
          {
              ID = (int)row.Elements("Field").Single(e => (string)e.Attribute("Name") == "ID"),
              PhysicalLocaltion = (string)row.Elements("Field").Single(e => (string)e.Attribute("Name") == "PhysicalLocation"),
          };

foreach (var r in res)
{
    Console.WriteLine(r);
}

Вот результат, напечатанный в цикле:

{ ID = 3327, PhysicalLocaltion = 11;#West }
0 голосов
/ 07 февраля 2012

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

        var xd = XDocument.Load("C:\\manifest.xml");
        var query = xd.Root.Descendants("Row").Elements("Field")
            .Select(s => new
            {
                Name = (string)s.Attribute("Name"),
                Value = s.Value
            });

Приведенный выше код перебирает каждый элемент «Row», затем читает данные элемента «Field».Он вернет следующий анонимный список:

Name = PhysicalLocation
Value = 11;#West
Name = ID
Value = 3327 

Чтобы выполнить цикл запроса, вы можете использовать следующий код:

        var sb = new StringBuilder();
        foreach (var i in query)
        {
            sb.Append("\n Name = ").Append(i.Name).Append("\n Value = ").Append(i.Value);
        }

Наконец, чтобы найти Field element value по Name, вы можете использовать следующий запрос:

var query2 = query.Where(w => w.Name == "ID").Single().Value;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...