2015-05-11 2 views
0

Я хочу, чтобы найти XML, который имеет атрибут раздел Мой код контроллера:Рассмотрим тег, который имеет атрибут в XML

xd.LoadXml(p.text); 
XmlNodeList txt = xd.GetElementsByTagName("Texts"); 
for (int i = 0; i < txt.Count; i++) 
{ 
    XmlNode nd = txt.Item(i); 
    if (nd.HasChildNodes) 
    { 
     XmlNodeList cnd = nd.ChildNodes; 
     foreach (XmlNode n in cnd) 
     { 
      if (SectionName == n.Attributes["section"].Value) 
      { 
       Text text = new Text() 
       { 
        AudioList = n.Attributes["audio"].Value 
       }; 
       newroom.text.Add(text); 
      } 
     } 
    } 
} 

и XML, как:

<Texts> 
    <Text group="Outbuilding0">blank</Text> 
    <Text group="Study0" audio="abc.wav" section="Walls and skirting">[[Walls and skirting]] </Text> 
    <Text group="Study0" audio="c.wav" section="Walls and skirting">[[Walls and skirting]] </Text> 
</Texts> 

Поиск только из которых имеет атрибут раздела .. любое предложение plz?

+0

Что такое атрибут 'audio'? Те, у которых атрибуты 'section' в вашем примере не имеют этого. –

+0

Я удалил его..Но я обновил @CharlesMager –

ответ

0

LINQ к XML будет сделать это намного проще:

var doc = XDocument.Parse(p.text); 

var texts = doc.Descendants("Text") 
    .Where(e => (string)e.Attribute("section") == SectionName) 
    .Select(e => new Text 
    { 
     AudioList = (string)e.Attribute("audio") 
    }); 

foreach (var text in texts) 
{ 
    newroom.text.Add(text); 
} 

Это, возможно, более удобным для чтения в синтаксисе запроса:

var texts = from text in doc.Descendants("Text") 
      let section = (string)text.Attribute("section") 
      where section == SectionName 
      select new Text 
      { 
       AudioList = (string)text.Attribute("audio") 
      }; 
+0

Его рабочий thnx alot для ur help :) –

+0

Последний вопрос: Если я хочу искать 'audiopath' из другого xml, который имеет то же имя, что и' AudioList' –

+0

Вам нужно будет загружать этот XML и искать его аналогичным образом. Если у вас есть какие-то конкретные проблемы с этим, попробовав, есть смысл задать новый вопрос. –

0

Вы можете попробовать использовать SelectNodes() прохождения подходящего xpath в качестве параметра:

XmlNodeList txt = xd.SelectNodes("//Texts/Text[@section]"); 
foreach(XmlNode t in txt) 
{ 
    Text text = new Text() 
    { 
     AudioList = t.Attributes["audio"].Value 
    }; 
    newroom.text.Add(text); 
} 

Выше xpath читает: выбрать все <Text> имеет атрибут section и является прямым потомком <Texts>.

+0

SORRY .. ваш код не дает никакого вывода .. показывает нуль в txt –

+0

Что-то должно быть неправильно. 'SelectNodes()' должен был возвратить некоторый результат, см. Демонстрацию: https://dotnetfiddle.net/KLkRSC – har07

Смежные вопросы