Этот код не может прочитать конкретный атрибут, точнее атрибут name. Вместо этого он читает текст узловых элементов и выполняет с ними concat - результат: 1F20 добавляется в список

var reader = new StringReader(xml);
            var xmlreader = new XmlTextReader(reader);
            xmlreader.WhitespaceHandling = WhitespaceHandling.None;
            var doc = new XPathDocument(xmlreader);
            var nav = doc.CreateNavigator();
            XPathExpression expr = nav.Compile("/Area/Lights/Light[@Name]");
            XPathNodeIterator iterator = nav.Select(expr);

            var list = new List<string>();
            while (iterator.MoveNext())
            {
                XPathNavigator nav2 = iterator.Current.Clone();
                list.Add(nav2.Value);  
            }

Я также пробовал: XPathExpression expr = nav.Compile ("// Light [@Name]");

Который возвращает пустой

Это xml, который я пытаюсь прочитать:

<Light Index="1" SetChannel="72" GetChannel="60" Name="y1 d1">
      <Nodes>1F</Nodes>
      <Nodes>20</Nodes>
    </Light>

Что я делаю не так - первая попытка xpath ...

1
lmkk 28 Июл 2010 в 17:19

2 ответа

Лучший ответ

Это полный XML? используя ваш фрагмент здесь, это работает

XPathExpression expr = nav.Compile("Light/@Name");

Просто чтобы добавить использование XPathExpression expr = nav.Compile("/Area/Lights/Light[@Name]");, это фильтр, вы запрашиваете узел Light, который имеет атрибут с именем Name, или вы можете сделать что-то вроде @Name = 'bob', где вы запрашиваете узел Light с атрибутом Имя равно Боб

3
Pharabus 28 Июл 2010 в 17:23

Вы пытаетесь прочитать все Light - элементы с атрибутом Name -.

Попробуйте //Light[@Name='xyz']/@Name, чтобы прочитать атрибут Name - из Light - элемента, где Name='xyz' или //Light/@Name для всех Name - атрибутов.

Помните, что [] для условий.

3
Tomalak 28 Июл 2010 в 17:30
Ошибок копирования и вставки больше, чем грамматических, но спасибо за редактирование; D
 – 
atamanroman
28 Июл 2010 в 17:33
Мне просто пришлось поправить "Ваш", это меня подергивало. : D
 – 
Tomalak
28 Июл 2010 в 20:37