2016-08-23 1 views
0

사용자가 스프레드 시트를 가져 와서 XML 형식으로 만들 수있는 시스템이 있습니다. 이 스프레드 시트는 동적입니다.C# XML Reader 어떻게 다음 요소로 이동했는지 알 수 있습니까?

스프레드 시트의 각 행은 XML의 요소입니다.

예를 들어

이 스프레드 시트 3 등 행 :

<DocumentElement> 
    <Person> 
     <Title /> 
     <FirstName>Tom</FirstName> 
     <Surname>Smith</Surname> 
     <eMail>[email protected]</eMail> 
     <PostCode>AA11 2BB</PostCode> 
     <Company></Company> 
     <TelephoneNumber>01111111111</TelephoneNumber> 
     <AddressLine1 /> 
     <AddressLine2 /> 
     <AddressLine3 /> 
    </Person> 
    <Person> 
     <Title /> 
     <FirstName>Simon</FirstName> 
     <Surname>Long</Surname> 
     <eMail>[email protected]</eMail> 
     <PostCode>AA11 2BB</PostCode> 
     <Company></Company> 
     <TelephoneNumber>01111111111</TelephoneNumber> 
     <AddressLine1 /> 
     <AddressLine2 /> 
     <AddressLine3 /> 
    </Person> 
    <Person> 
     <Title /> 
     <FirstName>Paul</FirstName> 
     <Surname>Boon</Surname> 
     <eMail>[email protected]</eMail> 
     <PostCode>AA11 2BB</PostCode> 
     <Company></Company> 
     <TelephoneNumber>01111111111</TelephoneNumber> 
     <AddressLine1 /> 
     <AddressLine2 /> 
     <AddressLine3 /> 
    </Person> 
</DocumentElement> 

다음 사람 클래스로 만들어 도착 이러한 행의 각. 그러나 XMLReader가 XML의 다음 요소로 이동 한 시점을 알아야하므로 다음 행에 대해 새 클래스를 만들 수 있습니다. 는 XML 리더에 대한 경우

그래서, 어떻게 내가 말할 수있는 톰 스미스 Person 클래스, 사이먼 롱 Person 클래스와 폴 도서 Person 클래스 : 나는 대한 사람 클래스가 있어야 너무

는 종료합니다 다음 요소로 이동하여 새로운 수업을 만들 수 있습니까?

답변

0

로 nextSibling이 정말 귀하의 질문에 대답하지 않는 키 ;-)

XmlDocument doc = new XmlDocument(); 
doc.Load("persons.xml"); 

XmlNode currNode = doc.DocumentElement.FirstChild; 
Console.WriteLine("First person..."); 
Console.WriteLine(currNode.OuterXml); 

XmlNode nextNode = currNode.NextSibling; 
Console.WriteLine("\r\nSecond person..."); 
Console.WriteLine(nextNode.OuterXml); 
+0

nextsibling은 단순히이 노드 바로 다음 노드를 가져 오지 않습니까? xmlread가 현재 노드 처리를 마쳤다는 것을 어떻게 알 수 있습니까? – user2183216

+1

@ user2183216이 경우에는 관련이 없습니다.'XmlDocument'는'Load' 중에 내부적으로'XmlReader'를 생성하고, 읽고, 처리했습니다. 이제 모든 XML이 메모리의 DOM에 있습니다. 옆으로, 당신이 DOM 경로를 가려고한다면 LINQ to XML이'XmlDocument'보다 바람직합니다. –

0

이지만, '사람'의 모든 노드를 선택하는 또 다른 방법이다.

XmlDocument doc = new XmlDocument(); 
doc.Load("persons.xml"); 
XmlNodeList nodes = doc.SelectNodes("//Person"); 

"Person"이라는 이름으로 문서의 모든 노드를 반환합니다.

그러면이 노드 목록을 반복하여 정보를 사용하여 클래스를 만들 수 있습니다.

"Person"요소를 찾는 문서를 탐색하는 번거 로움을 줄일 수 있습니다.

+0

다음 인물로 이동하기 전에 1 인을 처리하는 것을 어떻게 알 수 있습니까? – user2183216

+1

그래서 SelectNodes는 XmlNodes 목록을 반환합니다. 각 XmlNode를 사용하여 데이터에서 수행중인 모든 처리를 수행 할 수 있습니다. 예 : foreach (doc.SelectNodes ("Person")의 XmlNode 노드) { Console.WriteLine (node.FirstChild()); // 뭐든간에 } Person 노드를 찾기 위해 XML을 탐색 할 필요가 없습니다. 원하는 데이터를 얻기 위해 SelectNodes에서 가져온 노드 내부의 데이터로 이동하면됩니다. –

1

XmlReader을 직접 사용하고 있습니까? XmlSerializer은 작업에 적합한 도구처럼 보입니다.

[XmlRoot("DocumentElement")] 
public class DocumentElement : List<Person> 
{ 
} 

public class Person 
{ 
    public string Title { get; set; } 
    public string FirstName { get; set; } 
    public string Surname { get; set; } 
    public string eMail { get; set; } 
    public string PostCode { get; set; } 
    public string Company { get; set; } 
    public string TelephoneNumber { get; set; } 
    public string AddressLine1 { get; set; } 
    public string AddressLine2 { get; set; } 
    public string AddressLine3 { get; set; } 
} 

을 그리고 데이터를 deserialise : 어떤 클래스를 선언

var serializer = new XmlSerializer(typeof(DocumentElement)); 

using (var reader = XmlReader.Create(@"path\to\file.xml")) 
{ 
    var doc = (DocumentElement) serializer.Deserialize(reader);    
} 

가 작동 데모 this fiddle를 참조하십시오.

+0

필드가 동적이므로 클래스를 사용할 수 없습니다. – user2183216

+0

그래서 * 각 행은 Person 클래스로 만들어집니다 * 실제로? –

관련 문제