Динамически создавать предикаты, используя linq-to-xml на Windows Phone - PullRequest
0 голосов
/ 11 декабря 2011

Я работаю над приложением 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();

1 Ответ

1 голос
/ 11 декабря 2011

Примерно так должно работать:

var currentLevelElements = doc.Root.Elements();
int depth = 0;
while (currentLevelElements != null && depth < nodeDepth)
{
    currentLevelElements = currentLevelElements.Elements()
                                               .Where( x=> (string) x.Attribute("title") == AcmSinglton.GetTitle(depth));
    depth++;
}
var nodes = from x in currentLevelElements select new Menus.Chapter
                    {
                       Title = x.Attribute("title").Value
                    };

Кажется неловким запросить у Singleton информацию о заголовке - это зависимость, которую следует передать непосредственно в ваш метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...