2012-06-19 4 views
0

XML 파일에 50,000 개가 넘는 레코드가 있으며 향후 레코드에는 500,000 개 레코드가 포함될 수 있습니다. 각 레코드에는 주 수준 (레코드를 구별하는 데 사용됨), 공통 데이터 수준 (태그에는 각 레코드를 정의하는 특성이 포함됨) 및 세 번째 수준에는 각 레코드에 대한 특정 데이터가 포함됩니다 (주로 특성으로, 때로는 내부 텍스트로). 내 임무는이 파일을 여러 개의 작은 파일로 "해부하는 것"입니다. 세 번째 레벨에는 전체 레코드가 속한 그룹을 결정하는 속성이 있습니다. 파일의 각 레코드에 대해XML에서 새 파일로 데이터 복사

:

이 알고리즘은 다음과 같이 가야한다

  • 레코드가 속한 그룹을 결정하는 데 필요한 정보를 포함하는 속성을 읽기 (이 쉽고, 내가 해당 파일에이 부분)
  • 복사 전체 레코드 (모든 수준에있는 모든 편지를) 해결

그래서 내 질문은 무엇입니까 데이터를 새로운 파일에 복사하는 가장 쉬운 (그리고 가장 효율적인 방법) 무엇입니까? 일부 특정 데이터뿐만 아니라 전체 레코드를 복사해야한다는 점을 명심하십시오. 저는 C#에서 VS 2010을 사용하고 있습니다.

+0

XML 구조를 제공 할 수 있습니까?이를 위해 XSLT 파일을 구성 할 수 있어야합니다. –

답변

1

XmlReader을 사용하여 소스 파일의 노드를 처리하고 요구 사항을 충족하는 노드를 만나면 간단히 읽고 새 파일 (InnerXml)을 복사 할 수 있습니다. 현재 노드의 속성은 새 파일에 저장할 수있는 전체 문자열 표현을 제공합니다.

XML이 수백만 개의 레코드 크기로 커지기를 기대하는 경우 사전에이 성장을 예측하고 이러한 데이터 볼륨을 처리하는 데 더 적합한 데이터베이스로 전환하는 것이 좋습니다.

+0

첫 번째 수준을 건너 뜁니다. 전체 기록을 복사해야합니다. InnerXml은 두 번째와 세 번째 레벨 만 가져 오지만 첫 번째 레벨은 가져 오지 않습니다. – NDraskovic

+0

그러면이 최상위 레벨에 대한 참조 (로컬 변수)를 저장해야합니다. 필요한 노드를 만나는 즉시 변수를 설정하십시오. 그리고 조건이 나중에 충족되면이 참조를 다시 사용하고 InnerXml을 호출합니다. –

1

성능면에서 가장 효율적인 방법은 하나의 XmlReader 인스턴스를 가지고 큰 파일을 살펴 보는 것입니다. 대상이 될 수있는 여러 그룹이 있으므로 XmlWriter의 여러 인스턴스가 있어야합니다.이 인스턴스는 필요에 따라 만들고 다음 반복을 위해 "그룹 키"로 인덱싱 된 사전에 저장해야합니다.

XmlReaderXmlWriter을 사용하면 전체 파일을 메모리에로드하지 않아도됩니다.

중첩 된 레벨을 추적하려면 Stack을 사용하고, 내비게이션 할 때 항목을 밀고, 바깥쪽으로 이동할 때 팝업하거나 메소드의 로컬 변수 만 사용할 수 있습니다.

완료하면 Stream 인스턴스를 닫아야합니다.

0

부터 System.Xml까지 작업을 수행 할 수 있습니다. List<XmlElement>을 만들고 각각의 세 단계를 커버하십시오.

XmlDocument doc = new XmlDocument(); 
     doc.Load("Test.xml"); 
     XmlElement root = doc.DocumentElement; 
    //Preform your read and write operation here 
    doc.Save("Test.xml"); 
관련 문제