2014-09-10 2 views
1

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

<detail> 
    <address> 
    <line1/> 
    <line2/> 
    <line3/> 
    <postcode/> 
    </address> 
</detail/> 

Там может быть любое количество <line*> узлов, которые я хочу, чтобы выбрать, и другие узлы, которые я не хочу Выбрать.

Я попробовал это, не похоже на работу (в C# в любом случае):

/detail/address/[substring(name(),4) = 'line'] 

Al, оцененная помощь!

ответ

3

попробовать

/detail/address/*[starts-with(name(), 'line')] 
+0

Это сработало отлично, спасибо! – CompanyDroneFromSector7G

1

Из памяти, я думаю, что индекс 1 Основанное не 0 на основе. Возможно, это сработает:

/detail/address/[substring(name(),1,3) = 'line'] 

В качестве альтернативы, у вас есть контроль над форматом XML? Если да, то лучше подход может структурировать следующим образом:

<detail> 
    <address> 
    <line number='1'/> 
    <line number='2'/> 
    <line number='3'/> 
    <postcode/> 
    </address> 
</detail/> 

Затем вы можете использовать следующие действия для получения строки:

/detail/address/line 
+0

К сожалению, никакого контроля над форматом XML, но хорошая мысль спасибо! – CompanyDroneFromSector7G

1

Рассмотрите возможность использования XDocuments.

 XDocument doc = XDocument.Parse(xmlString); 
     foreach (XElement element in doc.Descendants()) 
     { 

      if(element.Name.LocalName.StartsWith("line")) 
       //DoStuffWithValueOfThatElement(element.Value)... 
     } 
1

Вы можете попробовать с contains:

/detail/address/*[contains(name(),'line')] 

Если вы хотите использовать substring вы знать, что индекс начинается с 1, и вы также отсутствует подстановочные:

/detail/address/*[substring(name(),1,4) = 'line'] 
Смежные вопросы