在两个子节点之间读取XML

在两个子节点之间读取XML,xml,c++-cli,Xml,C++ Cli,我在读取两个子节点之间所有子节点的值时遇到了一些问题。我有一个功能,目前正在“工作”,但它没有添加项目到一个列表框,因为它的本意。我也没有任何错误 应用程序的工作方式是,一旦在组合框中选择了一个文件,文件夹中所有XML的名称就会添加到组合框中,然后用该XML中的所有Testcycle编号填充另一个组合框。然后在cmobox框中选择一个数字,然后单击一个按钮,然后我希望将属性filename和hashcode的所有值写入列表框。也就是说,如果有20个文件名值和20个哈希代码值,则列表框中应该有40

我在读取两个子节点之间所有子节点的值时遇到了一些问题。我有一个功能,目前正在“工作”,但它没有添加项目到一个列表框,因为它的本意。我也没有任何错误

应用程序的工作方式是,一旦在组合框中选择了一个文件,文件夹中所有XML的名称就会添加到组合框中,然后用该XML中的所有Testcycle编号填充另一个组合框。然后在cmobox框中选择一个数字,然后单击一个按钮,然后我希望将属性filename和hashcode的所有值写入列表框。也就是说,如果有20个文件名值和20个哈希代码值,则列表框中应该有40个项目

唯一不起作用的功能是添加到列表框

void HashMe::AddToListBox()
{
    String^ SelectedFile = comboBox1->SelectedItem->ToString();
    String^ SearchString = "*" + SelectedFile + "*.XML";
    int SelectedTC = int::Parse(comboBox2->SelectedItem->ToString());

    try
    {
        array<String^>^ FullPaths = IO::Directory::GetFiles("E:\\XML Folder\\", SearchString, System::IO::SearchOption::AllDirectories);
        int number = FullPaths->GetLength(0);

        for (int x = 0; x < number; x++)
        {
            String^ FullPath = FullPaths[x];

            XPathNavigator^ Root = XPathDocument(FullPath).CreateNavigator();
            for each (XPathNavigator^ Nav in Root->Select(L"//TestCycle[@Number = '" + SelectedTC + "']"))
            {
                listBox4->Items->Add(Nav->GetAttribute(L"FileName",String::Empty)).ToString();
                listBox4->Items->Add(Nav->GetAttribute(L"HashCode",String::Empty)).ToString();
            }
        }
    }
    catch (Exception^ e)
    {
        MessageBox::Show(e->ToString());
    }
}
void HashMe::AddToListBox()
{
字符串^SelectedFile=comboBox1->SelectedItem->ToString();
字符串^SearchString=“*”+SelectedFile+“*.XML”;
int-SelectedTC=int::Parse(comboBox2->SelectedItem->ToString());
尝试
{
数组^FULLPATH=IO::Directory::GetFiles(“E:\\XML文件夹\\”,搜索字符串,系统::IO::搜索选项::所有目录);
int number=fullpath->GetLength(0);
对于(int x=0;xSelect(L”//TestCycle[@Number='“+SelectedTC+']))
{
listBox4->Items->Add(Nav->GetAttribute(L“FileName”,String::Empty)).ToString();
listBox4->Items->Add(Nav->GetAttribute(L“HashCode”,String::Empty)).ToString();
}
}
}
捕获(异常^e)
{
MessageBox::Show(e->ToString());
}
}
XML文件结构如下所示:

<?xml version="1.0" encoding="utf-8"?>
<Project Name="New">
  <TestCycle Number="1">
    <Files>
      <FileName File="C:\Users\brandonm\Documents\asd.xps" />
      <HashCode Code="AB-B5-85-EC-FE-C4-E2-41-09-6A-A8-77-69-A9-8D-1F" />
      <FileName File="C:\Users\brandonm\Documents\asdas.xps" />
      <HashCode Code="7F-30-12-76-C8-80-CA-03-EC-71-12-49-9E-56-9D-D8" />
      <FileName File="C:\Users\brandonm\Documents\asdasdasd" />
      <HashCode Code="09-37-69-EF-36-3B-FD-42-D2-37-2D-70-74-A6-ED-BA" />
    </Files>
  </TestCycle>
  <Project Name="New">
    <TestCycle Number="2">
      <Files>
        <FileName FileName="C:\Users\brandonm\Documents\asd.xps" />
        <HashCode HashCode="AB-B5-85-EC-FE-C4-E2-41-09-6A-A8-77-69-A9-8D-1F" />
        <FileName FileName="C:\Users\brandonm\Documents\asdas.xps" />
        <HashCode HashCode="7F-30-12-76-C8-80-CA-03-EC-71-12-49-9E-56-9D-D8" />
        <FileName FileName="C:\Users\brandonm\Documents\asdasd.xps" />
        <HashCode HashCode="E4-EF-33-AE-24-23-00-37-FD-E2-20-60-5E-68-C0-54" />
      </Files>
    </TestCycle>
  </Project>


任何帮助都将不胜感激。我认为我的XPath查询可能有问题。谢谢

首先,您需要更正您的XML,因为它不一致且格式不正确:

  • 打开的
    Project
    元素比关闭的元素多
  • 您没有根元素来包含每个
    项目
    元素
  • TestCycle
    #1下,您的
    FileName
    元素的属性名称是
    File
    ,而在
    TestCycle
    #2下,您的
    FileName
    元素的属性名称是
    FileName
    ;调和这些
  • TestCycle
    #1下,您的
    HashCode
    元素的属性名称是
    code
    ,而在
    TestCycle
    #2下,您的
    HashCode
    元素的属性名称是
    HashCode
    ;调和这些
我假设您将其修复为以下内容:


您的代码被编写为
FileName
HashCode
TestCycle
的属性,但实际上它们是
TestCycle/Files
下的元素,分别具有
File
code
的属性。很明显,您的代码在这里出错了;将每个
循环的内部
替换为如下内容:

String^fmt=L”//TestCycle[@Number='{0}']/Files/FileName/@File |///TestCycle[@Number='{0}']]/Files/HashCode/@code”;
对于每个(根目录中的XPathNavigator^Nav->Select(字符串::格式(fmt,SelectedTC)))
列表框4->项目->添加(导航->价值);

对于每个(根目录中的XPathNavigator^Cycle->Select(String::Format(L)/TestCycle[@Number='{0}']],SelectedTC)))
对于每个(XPathNavigator ^Nav in Cycle->Select(L“Files/FileName/@File | Files/HashCode/@Code”))
列表框4->项目->添加(导航->价值);

这似乎不是C++。嘿,伊尔德恩,谢谢你的帮助。XML问题是由于我的保存函数出现问题,如果文件存在或不存在,并且它们的语法不相同,我将使用两个不同的函数。现在正在填充我的列表框:)