c# - 如何遍历 XDocument,逐个对象获取完整的 XML 结构?

标签 c# linq-to-xml

我有一个 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/

相关文章:

c# - 对象函数在 LINQ to Entities 表达式中失败

c# - FormsAuthentication 和 WebSecurity 之间的区别

c# - 没有等待时删除信号量

c# - 使用 DPAPI 时安全地存储可选的熵

c# - 显式转换 XAttribute 值

c# - 如何使用 C++ (C#) 读取 flash 发送的声音流?

c# - 删除 XML 根目录下的特定节点?

asp.net - 如何将 xml 文件添加到我的项目中?

c# - LINQ to XML - 将节点添加到 .csproj 文件