2011-05-05 12 views
0

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

应用程序的工作方式是,一旦在组合框中选择了一个文件,文件夹内所有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查询可能存在问题。由于

+0

这似乎并非是C++。 – 2011-05-05 07:14:19

+0

我使用VS2008的Visual C++ – Brandonm 2011-05-05 07:53:51

回答

0

首先,你需要改正你的XML,因为它是不一致和畸形:

  • 你比接近的元素更开放Project元素
  • 你没有一个根元素包含每个Project元素
  • TestCycle#1将FileName元素的属性名是File,而下TestCycle#2的FileName元素的属性名是FileName;调和这些
  • TestCycle#1将HashCode元素的属性名是Code,而下TestCycle#2的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> 

您的代码写成虽然FileNameHashCodeTestCycle属性,但实际上他们是在元素TestCycle/Files,其各自的属性为FileCode。显然你的代码在这里是错误的;喜欢的东西取代你内心for each循环:

String^ fmt = L"//TestCycle[@Number = '{0}']/Files/FileName/@File | //TestCycle[@Number = '{0}']/Files/HashCode/@Code"; 
for each (XPathNavigator^ Nav in Root->Select(String::Format(fmt, SelectedTC))) 
    listBox4->Items->Add(Nav->Value); 

for each (XPathNavigator^ Cycle in Root->Select(String::Format(L"//TestCycle[@Number = '{0}']", SelectedTC))) 
    for each (XPathNavigator^ Nav in Cycle->Select(L"Files/FileName/@File | Files/HashCode/@Code")) 
     listBox4->Items->Add(Nav->Value); 
+0

Hey ildjarn,非常感谢您的帮助。 XML问题是由于我的保存功能存在问题,因为如果文件存在或不存在,并且它们的语法不完全相同,我使用了2个不同的函数。而我的列表框现在正在填充:) – Brandonm 2011-05-06 06:37:50