2011-05-05 48 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