1

我有通过 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,当我在我的代码中尝试该片段时,这是有道理的——该类似乎已从 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[]' 不能在当前平台上使用。”

4

1 回答 1

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 ...

于 2012-10-31T21:06:40.423 回答