WinRT 与 xsd.exe 生成的序列化/无权访问 System.Xml.XmlNode
Posted
技术标签:
【中文标题】WinRT 与 xsd.exe 生成的序列化/无权访问 System.Xml.XmlNode【英文标题】:WinRT with xsd.exe-generated serialization / no access to System.Xml.XmlNode 【发布时间】:2012-10-31 20:06:10 【问题描述】:我有通过 xsd.exe (xsd.exe someschema.xsd /classes) 生成的类。其中一个节点被声明为一个元素:
<xs:element name="containsxmlelementsbeneath"/>
正如(虚构的)名称所暗示的那样,它看起来像这样:
<containsxmlelementsbeneath>
<somemore>
...
</somemore>
</containsxmlelementsbeneath>
当它被反序列化时,我在调试器中看到它的类型
System.Xml.XmlNode[]
我可以在即时窗口中强制它
?((System.Xml.XmlNode[])elem.containsxmlelementsbeneath)[0].InnerXml
我没有 IntelliSense,当我在我的代码中尝试 sn-p 时,这很有意义 - 该类似乎已从 WinRT 配置文件中删除 - 如果您只需要 Windows.Data.Xml.Dom,那就太好了。 IXmlNode - 但在这种情况下不是。
如何获取该元素的字符串表示形式?有没有办法“修复” xsd.exe 生成的输出,使其使用 Windows.Data.Xml.Dom 进行序列化? (我觉得不像)
我遇到了他们没有想到的边缘案例吗?
更新 - 尝试了以下(我知道,滥用动态):
dynamic x = elem.containsxmlelementsbeneath;
string s = x[0].InnerXml;
这会产生“API 'System.Xml.XmlNode[]' 不能在当前平台上使用。”
【问题讨论】:
如何进入在 WinRT 上反序列化 XmlNode 的阶段?我会使用 xsd.exe 来生成类。在 WinRT 中包含这些类,然后在我反序列化之前得到一个编译错误。 【参考方案1】:我与另一位开发人员进行了(更长的)聊天 - 经过一些试验和错误,我们想出了一个解决方案:
<xs:element ref="containsxmlelementsbeneath"/>
<xs:element name="containsxmlelementsbeneath">
</xs:element>
这会为我们创建一个空类(通过 xsd.exe)
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
public partial class containsxmlelementsbeneath
必须这样修改:
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
public partial class containsxmlelementsbeneath : IXmlSerializable
[XmlIgnore]
public string Text get; set;
public System.Xml.Schema.XmlSchema GetSchema()
throw new System.NotImplementedException();
public void ReadXml(System.Xml.XmlReader reader)
Text = reader.ReadInnerXml();
public void WriteXml(System.Xml.XmlWriter writer)
throw new System.NotImplementedException();
请注意,除 XmlRoot 之外的所有属性都必须删除,否则会出现反射异常(对于 containsxmlelementsbeneath 类型,只能指定 XmlRoot 属性。请使用 XmlSchemaProviderAttribute 指定架构类型。)
结束结果:这个节点及其所有子节点都是一个普通的旧字符串。不再有不可访问的 XmlNode 或 XmlElement...
【讨论】:
以上是关于WinRT 与 xsd.exe 生成的序列化/无权访问 System.Xml.XmlNode的主要内容,如果未能解决你的问题,请参考以下文章
使用 WCF 将类序列化为 xsd.exe 生成的 JSON
如何将模型(从 xsd.exe 构建)序列化为 XmlDocument?
使用 xsd.exe 或 svcutil.exe 对 UWP 和 Xamarin 进行 C# XML 序列化