XML XPath Вопрос - PullRequest
       1

XML XPath Вопрос

4 голосов
/ 26 июня 2011

Мой XML-файл выглядит так, как показано ниже. Я пытаюсь в своем коде на C Sharp заполнить только поле со списком вопросов, основанных на названии выбранного курса.Так, например, если они выберут Программирование XML в комбинированном списке курса, он отобразит только вопросы для Программирования XML в комбинированном списке вопросов.Как должен выглядеть мой XPath для этого?Любая помощь будет оценена.

if (comboBoxCourse.SelectedItem.ToString() == selectNode.InnerText )
{
    try
    {
        XmlNodeList loadQuestions = loadDoc.SelectNodes("//Course/Questions");

        foreach (XmlNode xml in loadQuestions)
        {
            if (comboBoxCourse.SelectedItem.ToString() == selectNode.InnerText)
                comboBoxQuestions.Items.Add(xml.InnerText);
            else
                continue;
        }
    }

    catch (XmlException ex)
    {
        MessageBox.Show(ex.ToString());
    }
}
<?xml version="1.0" encoding="utf-8" ?>
<Courses>
    <Course>
        <Name>Direct X Programming</Name>
        <Professor>Michael Feeney</Professor>
        <Questions>Are you a Ninja</Questions>
        <Questions>What version of Direct X do we use?</Questions>
    </Course>
    <Course>
        <Name>XML Programming</Name>
        <Professor>Michael Feeney</Professor>
        <Questions>Are you an XML Ninja?</Questions>
        <Questions>What does XML stand for?</Questions>
    </Course>
    <Course>
        <Name>Windows GUI</Name>
        <Professor>Leanne Wong</Professor>
        <Questions>What is a treeview?</Questions>
        <Questions>What is a database?</Questions>
    </Course>
</Courses>

Ответы [ 3 ]

2 голосов
/ 26 июня 2011

Я бы использовал LINQ to XML вместо:

doc.Root.Elements()
   .Where(c => c.Element("Name").Value == "Windows GUI")
   .Elements("Questions")

Но если вы действительно хотите использовать XPath, это будет выглядеть примерно так:

/Courses/Course[Name = 'Windows GUI']/Questions

Будьте осторожны при построении запроса, потому что вы должны сделать некоторое экранирование строки от пользователя.

1 голос
/ 26 июня 2011

Используйте это выражение XPath :

/*/*[Name = 'XML Programming']/Questions

Выбирает любой элемент Questions, который является дочерним по отношению к любому элементу, который является дочерним по отношению к верхнему элементу, и который имеет дочерний элемент с именем Name, чье строковое значение равно 'XML Programming'

1 голос
/ 26 июня 2011

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

string xpath = string.Format("//Course[Name = '{0}']/Questions", comboBoxCourse.SelectedItem);
foreach (XmlNode node in loadDoc.SelectNodes(xpath))
      Debug.WriteLine(node.InnerText);

Чтобы загрузить другой комбинированный список из этих результатов, я бы заменил весь ваш метод следующим:

string xpath = string.Format("//Course[Name = '{0}']/Questions", comboBoxCourse.SelectedItem);
foreach (XmlNode node in loadDoc.SelectNodes(xpath))
      comboBoxQuestions.Items.Add(xml.InnerText);            
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...