C#XML Reader如何判断是否移动到下一个元素?

时间:2016-08-23 11:01:39

标签: c# xml xmlreader

我有一个允许用户导入电子表格的系统,然后将其制作成XML格式。这个电子表格是动态的。

电子表格的每一行都是XML中的一个元素。

例如,此电子表格为3行:

<DocumentElement>
   <Person>
      <Title />
      <FirstName>Tom</FirstName>
      <Surname>Smith</Surname>
      <eMail>example@example.com</eMail>
      <PostCode>AA11 2BB</PostCode>
      <Company></Company>
      <TelephoneNumber>01111111111</TelephoneNumber>
      <AddressLine1 />
      <AddressLine2 />
      <AddressLine3 />
   </Person>
   <Person>
      <Title />
      <FirstName>Simon</FirstName>
      <Surname>Long</Surname>
      <eMail>example@example.com</eMail>
      <PostCode>AA11 2BB</PostCode>
      <Company></Company>
      <TelephoneNumber>01111111111</TelephoneNumber>
      <AddressLine1 />
      <AddressLine2 />
      <AddressLine3 />
   </Person>
   <Person>
      <Title />
      <FirstName>Paul</FirstName>
      <Surname>Boon</Surname>
      <eMail>example@example.com</eMail>
      <PostCode>AA11 2BB</PostCode>
      <Company></Company>
      <TelephoneNumber>01111111111</TelephoneNumber>
      <AddressLine1 />
      <AddressLine2 />
      <AddressLine3 />
   </Person>
</DocumentElement>

然后将这些行中的每一行变为Person类。但是,我需要知道XMLReader何时移动到XML中的下一个元素,因此我可以为下一行创建一个新类。

所以最后我应该有一个人类: 汤姆史密斯人类班, Simon Long人类和 保罗书人类

那么,我如何判断XML阅读器是否即将移动到下一个元素,以便我可以创建一个新类?

3 个答案:

答案 0 :(得分:1)

为什么你直接使用XmlReaderXmlSerializer看起来像是工作的正确工具。声明一些类:

[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; }
}

反序列化您的数据:

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

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

有关正常工作的演示,请参阅this fiddle

答案 1 :(得分:0)

NextSibling是Key; - )

FROM python:2.7

RUN apt-get update && apt-get install -y vim gdal-bin libgdal-dev postgresql-client

# On Jessie, $(gdal-config --version) gives 1.10.1 and Pypi only has 1.10.0
# so we need to strip the last part of the version number
RUN VERSION=$(gdal-config --version); CFLAGS=$(gdal-config --cflags) easy_install GDAL==${VERSION%.*}

RUN mkdir -p /usr/src/app/requirements
COPY requirements /usr/src/app/requirements

WORKDIR /usr/src/app

ARG PIP_TRUSTED_HOST=127.0.0.1
ARG PIP_INDEX_URL=https://pypi.python.org/simple/
RUN pip install --no-cache-dir -r requirements/production.txt

# Clean up APT when done.
RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

COPY . /usr/src/app

RUN mkdir -p /usr/src/app/log

答案 2 :(得分:0)

这并不是真正回答你的问题,而是选择所有'人'节点的另一种方法。

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

这将返回文档中任何位置的所有节点,名称为“Person”。

然后,您可以遍历此节点列表并使用该信息来创建类。

它还可以省去浏览文档查找“Person”元素的麻烦。