c#.net xpath在遍历时未检出元素

c#.net xpath在遍历时未检出元素,c#,xml,xpath,traversal,C#,Xml,Xpath,Traversal,我正在开发一个页面,该页面使用XPATH遍历XML文档以提取某些数据元素并基于它们构建字符串。我能够正确地计算元素,但是当尝试通过它们进行顺序遍历时,一些正在计算的元素没有显示出来。最有可能的任务可以更有效地完成,任何协助正确完成这项任务将不胜感激 XML <?xml version="1.0" encoding="UTF-16"?> <Presentation> <Filename>Name of file</Filename>

我正在开发一个页面,该页面使用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>

文件名
1.2
23
文件名
幻灯片标题
文件名
幻灯片标题
测验名称
文件名
幻灯片标题
等
下面是一个XML示例。我遍历幻灯片,数数它们,同时也数数被测物体。(返回正确的数字)但是,当我遍历所有幻灯片试图获取幻灯片节点中每个测验的位置时,它从未命中任何quizobjects

C#

int numSlides;
XmlDocument doc=新的XmlDocument();
doc.LoadXml(xmlToParse.Text)//传入xml字符串
XmlElement根=doc.DocumentElement;
//从阈值节点获取幻灯片数
numSlides=Convert.ToInt32(root.SelectSingleNode(//阈值”).InnerText);
//获取测验/幻灯片的数量
XmlNodeList xnQuiz=root.SelectNodes(“/Presentation/Slides/Slide/quizobjects”)//返回7
XmlNodeList xnList=root.SelectNodes(“/Presentation/Slides/Slide”);
int[]quizlocaray=新的int[xnQuiz.Count]//创建数组以保存测验的位置
int j=0;
//在幻灯片列表中查找测验索引
for(int i=0;i
输出

numSlides
/XML格式的幻灯片总数:23

xnQuiz.Count
/XML测验总数:7

String.Join(“,”,quizlocaray)
/幻灯片列表中测验索引数组:0,0,0,0,0,0两个问题:

  • 在示例XML中,
    /Presentation/Slides/Slide[id='Slide id']/quizobjects/quizobject
    没有结束标记(本身也不是空标记)
  • quizobjects
    的最后一个XPath有一个额外的
    /
    。将其更改为
    “quizobjects”
    ,它就会工作
更改代码:

for(int i = 0; i < xnList.Count; i++)
{
    XmlNode quiz = xnList[i].SelectSingleNode("quizobjects"); // Changed from "/quizobjects"
    if(quiz != null) //stepping through quiz always equals null
    {
        quizLocArray[j] = (i + 1);
        j++;
    }
}
for(int i=0;i
您的XML数据似乎格式不正确,因为您缺少一个结束符
。我将继续并假设这只是一个打字错误

您需要将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>
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);
}

文件名
1.2
23
文件名
幻灯片标题
文件名
幻灯片标题
测验名称
文件名
幻灯片标题
C#代码:

<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>
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);
}
XmlDocument doc=新的XmlDocument();
尝试
{
使用(var reader=XmlReader.Create(“Presentation.xml”))
{
国际努姆斯利德斯;
文件加载(读卡器);
XmlElement根=doc.DocumentElement;
//从阈值节点获取幻灯片数
numSlides=Convert.ToInt32(root.SelectSingleNode(//阈值”).InnerText);
//获取测验/幻灯片的数量
XmlNodeList xnQuiz=root.SelectNodes(“/Presentation/Slides/Slide/quizobjects”);
XmlNodeList xnList=root.SelectNodes(“/Presentation/Slides/Slide”);
//创建数组以保存测验的位置
int[]quizlocaray=新的int[xnQuiz.Count];
int j=0;
//在幻灯片列表中查找测验索引
for(int i=0;i
只需将语句中的“/quizobjects”替换为“quizobjects”:

XmlNode quiz = xnList[i].SelectSingleNode("/quizobjects");
希望它能起作用


当路径开始时,它总是认为它是绝对路径。这就是您无法获取元素的原因。

请尝试以下操作:
XmlNode quick=xnList[i]。选择SingleNode(“./quizobjects”)如果删除
/
是否返回null?是否更正该类型遗漏了结束。谢谢你的帮助。