2016-08-23 2 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> 

Каждая из этих строк затем получает сделано в Person класса. Тем не менее, мне нужно знать, когда XMLReader переместился на следующий элемент в XML, поэтому я могу создать новый класс для следующей строки.

Так заканчивается я должен иметь класс лица для: Tom Smith Person класс, класс Simon Long Человек и класс Павел Книга Person

Итак, как я могу сказать, если читатель XML собирается перейдите к следующему элементу, чтобы затем я смог создать новый класс?

ответ

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

Не следует ли сразу получить узел сразу после этого узла? Как я узнаю, что xmlread завершил обработку текущего узла? – user2183216

+1

@ user2183216, что не имеет значения в этом случае, 'XmlDocument' создавал, читал и удалял' XmlReader' внутри во время 'Load' - весь XML теперь находится в DOM в памяти. В стороне, если вы собираетесь идти по маршруту DOM, LINQ to XML предпочтительнее «XmlDocument». –

0

Это на самом деле не отвечая на ваш вопрос, но это альтернативный способ выбора всех узлов в «лицо».

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

Это возвращает все узлы в любом месте документа с именем «Человек».

Затем вы можете перебрать этот список узлов и использовать информацию для создания своих классов.

Это также спасло бы вас от навигации по документу, в котором находились элементы «Человек».

+0

Как я узнаю, что он закончил обработку 1 Лица, прежде чем перейти к следующему Лицу? – user2183216

+1

, поэтому SelectNodes возвращает список XmlNodes. С каждым XmlNode вы можете делать любую обработку, которую вы делаете на данных. Например: foreach (узел XmlNode в doc.SelectNodes ("// Person")) { Console.WriteLine (node.FirstChild()); // Или что-то еще } Вам не нужно перемещаться по XML, чтобы найти узлы Person - вам просто нужно перейти к данным внутри узлов, которые вы возвращаете из 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 *, а это значит? –

Смежные вопросы