将 XML 反序列化为对象数组或单个对象
我正在尝试编写一个通用方法,可用于将 xml 反序列化为对象数组。
给定的 XML 如下所示:
<people>
<person>
<someElement>content</someElement>
</person>
<person>
<someElement>more content</someElement>
</person>
</people>
在下面的代码中显示为 xmlDoc
。和 person
类作为 T
XmlNodeReader reader = new XmlNodeReader(xmlDoc.DocumentElement);
XmlSerializer xmlSerializer = new XmlSerializer(typeof(T[]), new XmlRootAttribute(xmlDoc.DocumentElement.Name));
results = xmlSerializer.Deserialize(reader) as T[];
这按预期工作,并返回带有 2 个条目的 person[]
。
然而,在我正在使用的 API 中,如果只返回 1 个结果,它只会返回:
<person>
<someElement>content</someElement>
</person>
并且我的反序列化会失败。 person[]
保持为空。
关于实现这一点的最佳方法有什么想法吗?
编辑
我正在考虑在两者之间运行 XSLT,并传递 T
的名称,如果它与根节点匹配,然后添加一个包装节点?
I'm trying to write a generic method that can be used to deserialize xml to an array of objects.
Given XML that looks like so:
<people>
<person>
<someElement>content</someElement>
</person>
<person>
<someElement>more content</someElement>
</person>
</people>
Shown in the below code as xmlDoc
. And a person
class as T
XmlNodeReader reader = new XmlNodeReader(xmlDoc.DocumentElement);
XmlSerializer xmlSerializer = new XmlSerializer(typeof(T[]), new XmlRootAttribute(xmlDoc.DocumentElement.Name));
results = xmlSerializer.Deserialize(reader) as T[];
This works as expected, and returns person[]
with 2 entries.
However, in the API I am working with, if there is only 1 result returned, it just returns:
<person>
<someElement>content</someElement>
</person>
And my deserialization breaks down. person[]
remains empty.
Any thoughts on the best way to implement this?
Edit
I'm contemplating running an XSLT in between, and passing the name of T
in, if it matches the root node, then add a wrapping node?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我最终使用 XSLT 来确保我所查找的节点不是根节点。
基本上我有一个 XSLT 文件,其中包含:(
不确定这个 XSLT 是否理想,希望有一些评论)。
这封装了来自 api 的入站 XML。我之前提到的
Person
类应用了一个[XmlType("person")]
属性,我可以执行以下操作:I ended up using XSLT to ensure the node(s) I was after weren't the root.
Basically I've a XSLT file containing:
(Not sure if this XSLT is ideal, would love some comments).
This wraps a around my inbound XML from the api. My previously mentioned
Person
class has a[XmlType("person")]
attribute applied to it, armed with that I can do:检查 Root 元素的 Name,如果不是
people
,则将其添加到 xml 中,一切都会正常。更新:
检查 xml 文档的深度,如果其 == 2,则创建根元素。
另一种方法 - 使用 LINQ-TO-XML
XElement.Descandants("person")
- person 元素数组Check Name of the Root element, and if it is not
people
, add it to xml, and everything will go fine.Update:
Check deep of the xml document, and if its == 2, create root element.
Another way - use of LINQ-TO-XML
XElement.Descandants("person")
- array ofperson
-elements