Этот код не может прочитать конкретный атрибут, точнее атрибут 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 ...
2 ответа
Это полный XML? используя ваш фрагмент здесь, это работает
XPathExpression expr = nav.Compile("Light/@Name");
Просто чтобы добавить использование XPathExpression expr = nav.Compile("/Area/Lights/Light[@Name]");
, это фильтр, вы запрашиваете узел Light, который имеет атрибут с именем Name, или вы можете сделать что-то вроде @Name = 'bob'
, где вы запрашиваете узел Light с атрибутом Имя равно Боб
Вы пытаетесь прочитать все Light
- элементы с атрибутом Name
-.
Попробуйте //Light[@Name='xyz']/@Name
, чтобы прочитать атрибут Name
- из Light
- элемента, где Name='xyz'
или //Light/@Name
для всех Name
- атрибутов.
Помните, что []
для условий.
Похожие вопросы
Новые вопросы
c#
C# (произносится как «see Sharp») — это высокоуровневый мультипарадигменный язык программирования со статической типизацией, разработанный Microsoft. Код C# обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, которое включает в себя .NET, .NET Framework, .NET MAUI и Xamarin среди прочих. Используйте этот тег для ответов на вопросы о коде, написанном на C#, или о формальной спецификации C#.