c# .net xpath 遍历时不挑选元素

标签 c# xml xpath traversal

我正在开发一个页面,该页面使用 XPATH 遍历 XML 文档以提取某些数据元素并基于它们构建字符串。我能够正确计算元素,但是当尝试排序遍历它们时,某些正在计算的元素没有显示。该任务很可能可以更有效地完成,任何有关正确完成此任务的帮助将不胜感激。

XML

<?xml version="1.0" encoding="UTF-16"?>
<Presentation>
    <Filename>Name of file</Filename>
    <version>1.2</version>
    <threshold>23</threshold> <!-- gives number of slides -->
    <Slides>
        <Slide id="slide id">
            <Filename>Name of file</Filename>
            <Title>Title of slide</Title>
        </Slide>
        <Slide id="slide id">
            <Filename>Name of file</Filename>
            <Title>Title of slide</Title>
            <quizobjects>
                <quizobject id="1">
                <filename>Name of quiz</filename>
            </quizobjects>
        </Slide>
        <Slide id="slide id">
            <Filename>Name of file</Filename>
            <Title>Title of slide</Title>
        </Slide>
        ...etc
     </Slides>
</Presentation>

这是 XML 的示例。我遍历幻灯片并数出测验对象。 (这会返回正确的数字)但是,当我遍历所有幻灯片试图获取“幻灯片”节点中每个测验的位置时,它永远不会命中任何测验对象。

C#

int numSlides;

XmlDocument doc = new XmlDocument();
doc.LoadXml(xmlToParse.Text); //pass in xml string
XmlElement root = doc.DocumentElement;

//get number of slides from threshold node
numSlides = Convert.ToInt32(root.SelectSingleNode("//threshold").InnerText);

//get number of quizzes/slides
XmlNodeList xnQuiz = root.SelectNodes("/Presentation/Slides/Slide/quizobjects"); //returns 7
XmlNodeList xnList = root.SelectNodes("/Presentation/Slides/Slide");

int[] quizLocArray = new int[xnQuiz.Count]; //create array to hold location of quizzes

int j = 0;
//find index of quizzes in slide list
for(int i = 0; i < xnList.Count; i++)
{
    XmlNode quiz = xnList[i].SelectSingleNode("/quizobjects");
    if(quiz != null) //stepping through quiz always equals null
    {
        quizLocArray[j] = (i + 1);
        j++;
    }
}

输出

numSlides/XML 中的幻灯片总数:23

xnQuiz.Count/XML 中的测验总数:7

String.Join(",", quizLocArray)/幻灯片列表中测验索引数组:0,0,0,0,0,0,0

最佳答案

您的 XML 数据似乎格式不正确,因为您缺少结尾 </quizobject> 。我将继续假设这只是一个错字。

您需要将 XPath 查询从 SelectSingleNode("/quizobjects") 更改为至SelectSingleNode("quizobjects")获取所需的 XML 元素。

Presentation.xml 文件:

<Presentation>
  <Filename>Name of file</Filename>
  <version>1.2</version>
  <threshold>23</threshold>

  <!-- gives number of slides -->
  <Slides>
    <Slide id="slide id">
      <Filename>Name of file</Filename>
      <Title>Title of slide</Title>
    </Slide>
    <Slide id="slide id">
      <Filename>Name of file</Filename>
      <Title>Title of slide</Title>
      <quizobjects>
        <quizobject id="1">
          <filename>Name of quiz</filename>
        </quizobject>
      </quizobjects>
    </Slide>
    <Slide id="slide id">
      <Filename>Name of file</Filename>
      <Title>Title of slide</Title>
    </Slide>
  </Slides>

</Presentation>

C# 代码:

XmlDocument doc     = new XmlDocument();

try
{
    using (var reader = XmlReader.Create("Presentation.xml"))
    {
        int numSlides;

        doc.Load(reader);

        XmlElement root = doc.DocumentElement;

        //get number of slides from threshold node
        numSlides = Convert.ToInt32(root.SelectSingleNode("//threshold").InnerText);

        //get number of quizzes/slides
        XmlNodeList xnQuiz = root.SelectNodes("/Presentation/Slides/Slide/quizobjects");
        XmlNodeList xnList = root.SelectNodes("/Presentation/Slides/Slide");

        //create array to hold location of quizzes
        int[] quizLocArray = new int[xnQuiz.Count];

        int j = 0;

        //find index of quizzes in slide list
        for (int i = 0; i < xnList.Count; i++)
        {
            XmlNode quiz = xnList[i].SelectSingleNode("quizobjects");
            if (quiz != null)
            {
                quizLocArray[j] = (i + 1);
                j++;
            }
        }
    }
}
catch (Exception exception)
{
    Console.WriteLine(exception.Message);
}

关于c# .net xpath 遍历时不挑选元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6274461/

相关文章:

java - 我使用的是哪个版本的 XPATH 和 XSLT..?

java - getChildNodes() 在 XML 中为我的根返回 NULL

c# - 选择行后调用哪个 DataGridView 事件

c# - 如何从图像控制 Windows 8 应用程序将图像保存到文件夹

java - 使用 Jackson 进行 XML 反序列化

java - 向 StAX 解析器提供 DTD 文件

javascript - jQuery 中的这个选择器语法发生了什么变化?

c# - 使用 Roslyn 的编译时源代码修改

c# - 如何在 OnRowEditing 中保留行值

r - 我如何在 R-Bloggers 上获取我的 blogdown 博客?