问题描述
我有一个的XmlDocument
,我可以用的XmlNode
遍历或将其转换为 。的XDocument
,并通过LINQ遍历它
I have an XmlDocument
which I can traverse with XmlNode
or convert it to a XDocument
and traverse it via 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>[email protected]</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>[email protected]</Email>
</Person>
</Dataset>
问题1
我想转换该人员记录/在XML中一个业务实体对象(POCO)节点。
所以我必须通过在一次一个人节点进行迭代,然后解析各个值。这最后一位是本身就很有趣,但首先我必须得到实际的人的记录。我的问题是,如果我通过各个节点选择(使用说的XMLList
在 XmlDocoment
)。
我最终被名聚集所有领域。我担心这样做的情况下,个人节点之一,是不完整的,甚至是缺失的,然后我不知道,当我经过一个缺少和业务对象聚集的字段。我会尝试和验证 - 。见问题2
I end up aggregating all fields by name. I am concerned to do this in case one of the person nodes is incomplete, or even missing and then I won't know which is missing when I pass through and aggregate the fields in to business objects. I will try and validate - see question 2.
我明白,这可以通过反射来实现,但我很感兴趣
I realize this can be done through reflection but I am interested.
我试图迭代通过Person对象:
I tried iterating through by Person object:
选项1:
foreach (XObject o in xDoc.Descendants("Person"))
{
Console.WriteLine("Name" + o);
// [...]
}
这让我2人记录(正确的),每个字符串化完整的XML文档 - 格式化为一个XML文档。 。上面的XML文档的只是一个子集
This gets me 2 person records (correct) each a stringified complete XML doc - formatted as an XML document. Just a subset of the above XML document.
但如何分割记录现在到单独的节点或领域 - 最好是尽可能无痛
But how to split up the record now into separate nodes or fields - preferably as painless as possible?
选项2:
foreach (XElement element in xDoc.Descendants("Person"))
{
// [...]
}
这让我的XML节点 - 唯一值 - 每个人都在一个字符串,如:
This gets me the XML nodes - values only - for each Person all in one string, e.g.
1234567Smith- RodrigezJohn-海梅 - 温斯顿JuniorLevel 5,市中区2座,121国王威廉StNorth阿德莱德5000ICPR08 8888 8888041 888 [email protected]
再次,没有太大的用处。
Again, not much use.
我可以验证一个的XDocument
很容易,有MSDN上一些很好的例子,但我想知道我怎么可以标记一个错误的记录。理想情况下,我希望能够在飞行中留下旧的背后良好的记录筛选出一个新的的XDocument
。这可能吗?
I can validate an XDocument
quite easily, there are some good examples on MSDN, but I'd like to know how can I flag a wrong record. Ideally, I'd like to be able to filter the good records out to a new XDocument
on the fly leaving the old ones behind. Is this possible?
推荐答案
的问题是,你只是打印出的元素为字符串。您需要编写的代码转换成一个的XElement
<的;人>
进入你的业务对象。诚然,我会的期望的完整的XML,而不是被写出来 - 你确定你没有打印出 XElement.Value
(其中串联所有?后代文本节点)
The problem is that you're just printing out the elements as strings. You need to write code to convert an XElement
of <Person>
into your business object. Admittedly I'd expect the full XML to be written out instead - are you sure you're not printing out XElement.Value
(which concatenates all the descendant text nodes)?
(我不知道回答你的第二个问题 - 我建议你问它作为一个单独的问题在这里,让我们不要T得到答案的混合物在一个页面。)
(I'm not sure of the answer to your second question - I suggest you ask it as a separate question here, so that we don't get a mixture of answers in one page.)
这篇关于如何通过一个XDocument迭代,通过对象获取完整的XML结构,对象吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!