2011-05-05 7 views
0

두 자식 노드 사이의 모든 하위 자식 노드 값을 읽는 데 약간 문제가 있습니다. 현재 "작동 중"인 함수가 있지만 목록 상자에 항목을 추가하지 않습니다. 어떤 오류도 발생하지 않습니다.두 자식 노드 간 XML 읽기

콤보 상자에서 파일을 선택하면 폴더 내의 모든 XML 이름이 콤보 상자에 추가됩니다. 다른 콤보 상자에는 해당 XML에있는 모든 테스트 사이클 번호가 채워집니다. 그런 다음 cmobox 상자 안의 숫자를 선택한 다음 버튼을 클릭하면 filename 및 hashcode 속성의 모든 값을 목록 상자에 기록합니다. 나는. 20 개의 파일 이름 값과 20 개의 해시 코드 값이 있으면 목록 상자에 40 개의 항목이 있어야합니다.

작동하지 않는 유일한 기능은 목록 상자 1에 추가하는 것입니다.

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++로 표시되지 않습니다. –

+0

Visual C++ VS2008을 사용하고 있습니다. – Brandonm

답변

0

먼저 당신이 당신의 XML을 수정해야합니다

  • 당신이 당신은 각 Project 요소를 포함하는 루트 요소가없는
  • 가까운 요소보다 더 개방 Project 요소 속성 이름 FileName입니다
  • 1 # TestCycle에서 당신의 FileName 요소 'TestCycle #에서 2 당신의 FileName 요소 반면 속성 이름은, File이다'가; 속성 이름 HashCode입니다 조정이
  • 1 # TestCycle에서 당신의 HashCode 요소 'TestCycle #에서 2 당신의 HashCode 요소 반면 속성 이름은, Code이다'가; 화해 난 당신이 같은 것으로이 문제를 해결 가정합니다

이 다음

<?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 것처럼 기록되고 HashCodeTestCycle의 속성이지만, 현실에서 그들은 아래 요소이야 각각의 속성이 FileCodeTestCycle/Files입니다. 분명히 여기에 코드가 잘못되었습니다. 같은과 내면의 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

안녕하세요. ildjarn, 도움을 주셔서 감사합니다. XML 문제는 파일 저장 또는 존재하지 않았고 구문이 동일하지 않은 경우 두 가지 다른 기능을 사용하는 저장 기능 문제로 인해 발생했습니다. 그리고 내 목록 상자는 현재 채워집니다 :) – Brandonm