Я работаю над приложением Window Phone, где мне нужно использовать xpath с linq.К сожалению, xpath в настоящее время не поддерживается.У меня есть XML-файл, который я рекурсивно раскрываю, когда пользователь выбирает узлы.Узел () / @ title загружается в список.Пользователь выбирает и так далее.Обычно я бы динамически создавал предикаты xpath.
Например:
<cfr>
<chapter title="CHAPTER VI" volume="6">
<subchapter title="SUBCHAPTER A" volume="6">
<part number="600" title="PART 600">
<subpart number="Subpart A" part="PART 600" title="Subpart A Farm Credit Administration">
<section number="600.1" title="The Farm Credit Act." part="PART 600" link="12CFR600.1" type="cfr"/>
<section number="600.2" title="Farm Credit Administration." part="PART 600" link="12CFR600.2" type="cfr"/>
</subpart>
</part>
<part number="601" title="PART 601">
<section number="601.1" title="The Credit Act." part="PART 601" link="12CFR6001.1" type="cfr"/>
</part>
</subchapter>
<part>......</part>
</chapter>
</cfr>
В xpath я бы использовал:
/node()/node()/node()/node()[@title='PART 601']/node()[@title='The Music Act.']/@title
Я отслеживаю, насколько глубоко пользовательнажал и какой индекс.Я бы построил предикат xpath примерно так в c #:
private String XpathBuilder(bool isParentNode)
{
int nCount = AcmSinglton.NodeCount;
StringBuilder nodeStr = new StringBuilder();
nodeStr.Append("/node()/node()");
for (int i = 0; i < nCount; i++)
{
if (i != 0)
{
nodeStr.Append("[@title = '" + AcmSinglton.TitlePredicatesArrayList.get(i - 1).toString() + "']/node()");
}
else
{
nodeStr.Append("/node()");
}
}
return nodeStr.ToString();
}
Так что я ищу идею для динамического построения предикатов с использованием linq-to-xml.
Вот что у меня есть:
XDocument xml = XDocument.Load(String.Format("Resourses/c{0}x{1}.xml", this.CFRTitle, this.Volume));
var nodes = from x in xml.Elements().ElementAt(nodeDepth).Elements()
select new Menus.Chapter
{
Title = x.Attribute("title").Value
};
this.MainListBox.ItemsSource = nodes.ToList();