我有一个 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>
问题一
我想将 XML 中的个人记录/节点转换为业务实体对象 (POCO)。
因此,我必须一次遍历一个 Person 节点,然后解析各个值。最后一点本身很有趣,但首先我必须获得实际的 Person 记录。我遇到的问题是,如果我按单个节点进行选择(在 XmlDocomment
中使用 say XmlList
)。
我最终按名称聚合了所有字段。我担心这样做是为了防止其中一个人员节点不完整,甚至丢失,然后当我通过并将字段聚合到业务对象中时,我将不知道丢失了哪个。我会尝试验证 - 请参阅问题 2。
我意识到这可以通过反射(reflection)来完成,但我很感兴趣。
我尝试通过 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 Adelaide 5000ICPR08 8888 8888041 888 999111111curly@stooge.comE
同样,没有太大用处。
问题2
我可以很容易地验证 XDocument
,MSDN 上有一些很好的示例,但我想知道如何标记错误记录。理想情况下,我希望能够即时将好的记录过滤到新的 XDocument
中,而将旧记录留在后面。这可能吗?
最佳答案
问题是您只是将元素作为字符串打印出来。您需要编写代码来转换 XElement
的 <Person>
进入您的业务对象。诚然,我希望写出完整的 XML - 你确定你没有打印出 XElement.Value
(连接所有后代文本节点)?
(我不确定您第二个问题的答案 - 我建议您在这里将其作为一个单独的问题提出,这样我们就不会在一页中得到混合的答案。)
关于c# - 如何遍历 XDocument,逐个对象获取完整的 XML 结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2041991/