【发布时间】:2015-12-16 17:29:00
【问题描述】:
我有一个XmlDocument,我可以用XmlNode 遍历它,或者将它转换为XDocument 并通过LINQ 遍历它。
<Dataset>
<Person>
<PayrollNumber>1234567</PayrollNumber>
<Surname>Smith-Rodrigez</Surname>
<Name>John-Jaime-Winston Junior</Name>
<Skills>
<Skill>ICP</Skill>
<Skill>R</Skill>
</Skills>
<HomePhone>08 8888 8888</HomePhone>
<MobilePhone>041 888 999</MobilePhone>
<Email>curly@stooge.com</Email>
</Person>
<Person>
<PayrollNumber>12342567</PayrollNumber>
<Surname>Smith-Rodrigez</Surname>
<Name>Steve</Name>
<Skills>
<Skill>Resus</Skill>
<Skill>Air</Skill>
</Skills>
<HomePhone>08 8888 8888</HomePhone>
<MobilePhone>041 888 999</MobilePhone>
<Email>curly@stooge.com</Email>
</Person>
</Dataset>
问题 1
我想将 XML 中的人员记录/节点转换为业务实体对象 (POCO)。
因此,我必须一次遍历一个 Person 节点,然后解析各个值。最后一点本身很有趣,但首先我必须获取实际的 Person 记录。我遇到的问题是,如果我按单个节点进行选择(在 XmlDocoment 中使用 XmlList)。
我最终按名称聚合所有字段。我担心如果其中一个人员节点不完整,甚至丢失,然后当我通过并将字段聚合到业务对象时我不知道丢失了哪个。我会尝试验证 - 请参阅问题 2。
我意识到这可以通过反思来完成,但我很感兴趣。
我尝试通过 Person 对象进行迭代:
选项 1:
foreach (XObject o in xDoc.Descendants("Person"))
{
Console.WriteLine("Name" + o);
// [...]
}
这为我提供了 2 个人记录(正确),每个记录都是字符串化的完整 XML 文档 - 格式化为 XML 文档。只是上述 XML 文档的一个子集。
但是现在如何将记录拆分为单独的节点或字段 - 最好尽可能轻松?
选项 2:
foreach (XElement element in xDoc.Descendants("Person"))
{
// [...]
}
这让我得到了 XML 节点 - 仅值 - 每个人都在一个字符串中,例如
1234567Smith-RodrigezJohn-Jaime-Winston JuniorLevel 5, City Central Tower 2, 121 King William StNorth 阿德莱德 5000ICPR08 8888 8888041 888 999111111curly@stooge.comE
再说一遍,用处不大。
问题 2
我可以很容易地验证XDocument,MSDN 上有一些很好的例子,但我想知道如何标记错误记录。理想情况下,我希望能够即时将好的记录过滤到新的XDocument 中,而将旧记录留在后面。这可能吗?
【问题讨论】:
标签: c# linq-to-xml