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 序列化

在不修改 C# XSD 类的情况下向 XML 序列化添加前缀和命名空间

多个 xsd 文件的 xsd.exe 类生成器问题

xsd.exe 生成正确的类型