2009-12-03 3 views
0

한번에 두 개 이상의 XML 파일을 처리하는 프로젝트를 만들고 싶습니다.이 프로젝트에서 XML 파일을 배열에 넣고 사용했지만 항상 오류가 발생했습니다. 내 코드는 다음과 같습니다. 그런 :. 모든 XML : // 여기에xml 파일에 C#

string[] files = { "ilk.xml", "migr.xml", "caa.xml" }; 
    public Form1() 
    { 
     InitializeComponent(); 

     System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(@"c:\markets\"); 
     count = dir.GetFiles("*.xml").Length; 

     for (int d = 0; d < count; d++) 
     { 

      XmlDocument xmlDoc1 = new XmlDocument(); 

      xmlDoc1.Load(files[d]); 

      xmldocument= new XmlDocument(); 

      xmldocument.Load(@"C:\\markets\files[d]"); 

나는 XML 파일

     } 

오류가 \ "시장 파일 [D]를 \ C가 '파일을 찾을 수 없습니다"입니다의 값을 비교 파일은 시장 디렉토리에 있습니다. 배열을 사용하지 않고 파일 이름을 썼을 때 아무런 문제가 없습니다. 도와 주실 수 있습니까?

답변

0

"동시에"(동시에 병렬로)로드하려는 경우 비동기로드 및 멀티 스레딩을 사용할 수 있습니다. 아마도 XML 문서를 모두 비교하고 동시에 주석을 기반으로 모든 XML 문서를 파싱하고로드하고 싶을 수도 있습니다. XmlDocument 개체의 배열을 사용하여 파일 이름의 입력 배열을 일치시키는 방법은 어떻습니까? 이것들을 모두로드하는 가장 간단한 방법입니다. 역동적 인 컬렉션이 필요할 경우 컬렉션을 사용할 수도 있습니다.

public void CompareXMLInDir(string path) 
{ 
    DirectoryInfo dir = new DirectoryInfo(path); 
    CompareXML(dir.GetFiles("*.xml")); 
} 

public void CompareXML(FileInfo[] xmlFileNames) 
{ 
    XmlDocument[] xmlDocuments = new XmlDocument[xmlFileNames.Length]; 
    for(int i = 0; i < xmlFileNames.Length; i++) 
    { 
     xmlDocuments[i] = new XmlDocument(); 
     xmlDocuments[i].Load(xmlFileNames[i].FullName); 
    } 

    //...do compare work here 
} 

이 코드를 사용하면 디렉토리에 ".xml"확장명을 가진 모든 파일을 검색 할 수 있습니다. 이것은 카운트와 관련이있는 것으로 보이지만 정적으로 정의 된 파일 이름 배열을 참조합니다. 해당 디렉토리의 XML 파일 수가 배열의 파일 이름을 초과하면 오류가 발생합니다. 당신은 단지 이름의 고정 세트를 사용하고 싶다면

, 당신은이 작업을 수행 할 수 있습니다 :

public void CompareMyXMLFiles() 
{ 
    string[] files = { "ilk.xml", "migr.xml", "caa.xml" }; 
    CompareXML(@"c:\markets", files); 
} 

public void CompareXML(string basePath, string[] xmlFileNames) 
{ 
    XmlDocument[] xmlDocuments = new XmlDocument[xmlFileNames.Length]; 
    for(int i = 0; i < xmlFileNames.Length; i++) 
    { 
     xmlDocuments[i] = new XmlDocument(); 
     xmlDocuments[i].Load(basePath + @"\" + xmlFileNames[i]); 
    } 

    //...do compare work here 
} 
+0

지금 도움이되어 주셔서 감사합니다. –

+0

아래쪽 투표를 이해하지 못합니다 ... 답변을 받아 들였습니다. 누군가 제발 그걸 설명 할 수 있니? –

+0

@Kevin Brock - 대답은 단순한 잘못 인용 된 인용 부호였습니다. 문제가되는 줄을 다시 썼기 때문에 당신의 영혼은 효과가 있습니다. – MiffTheFox

10

배열 참조를 연결하는 대신 문자열 자체에 넣습니다.

xmldocument.Load(@"C:\markets\" + files[d]); 
-1

여러 파일을 한꺼번에 처리하는 경우를 언급했습니다.

위의 코드는이를 달성하지 못합니다. 그렇게하기 위해 스레딩을 살펴보아야합니다. 파일 처리를 별도의 함수로 옮긴 다음 ThreadStart 및 Thread 인스턴스를 만들어 작업을 활성화해야합니다. 그런 다음 실행하려는 동시 프로세스 수에 따라 별도의 스레드에서 함수를 호출하기 위해 읽는 디렉토리 및 파일 목록에 대한 일부 논리가 필요합니다.

+0

당신은 추가 스레드를 많이 의지하지 않고 asyn 처리를 얻을 수 있습니다. XmlReader/Writer를 사용하면 새 스레드 하나를 직접 작성하지 않고 비동기 적으로 모든 파일을 처리 할 수 ​​있습니다. 네, 그것들을 조정해야하지만 그만한 가치가 있습니다. –

+0

나는 "한꺼번에 여러 파일"이라고 생각한다. OP는 단일 파일을 처리하는 것과는 대조적으로 여러 파일을 처리하는 것을 의미하지만, 동시성은 다루지 않는다. (원래 소스 코드에서 추측하고 있습니다.) – JMD