在两个子节点之间读取XML

时间:2011-05-05 07:10:24

标签: xml c++-cli

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

应用程序的工作方式是,一旦在组合框中选择了一个文件,文件夹中所有xml的名称就会被添加到组合框中。然后,另一个组合框将填充该XML中的所有Testcycle编号。然后,您在cmobox框中选择一个数字,然后单击一个按钮,然后我想要将属性文件名和哈希码的所有值写入列表框。即如果有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());
    }
}

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查询可能存在问题。感谢

1 个答案:

答案 0 :(得分:0)

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

  • 您有比关闭元素更多的开放Project元素
  • 您没有包含每个Project元素的根元素
  • TestCycle#1下,您的FileName元素'属性名称为File,而在TestCycle#2下,您的FileName元素属性名称为{{ 1}};调和这些
  • FileName#1下,您的TestCycle元素'属性名称为HashCode,而在Code#2下,您的TestCycle元素属性名称为{{ 1}};调和这些

我假设您将此修复为以下内容:

HashCode

您的代码编写好像HashCode<?xml version="1.0" encoding="utf-8"?> <Projects> <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> <Project Name="New"> <TestCycle Number="2"> <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\asdasd.xps" /> <HashCode Code="E4-EF-33-AE-24-23-00-37-FD-E2-20-60-5E-68-C0-54" /> </Files> </TestCycle> </Project> </Projects> 属于FileName的属性,但实际上它们是HashCode下的元素,其属性为TestCycle }和TestCycle/Files。显然你的代码在这里是错误的;用以下内容替换内部File循环:

Code

for each