【问题标题】:Xsd.exe Any Type to XmlElement conversion. How to fill generated property?Xsd.exe 任何类型到 XmlElement 的转换。如何填充生成的属性?
【发布时间】:2011-11-14 16:58:34
【问题描述】:

我有一个 XSD(它是http://web.rete.toscana.it/eCompliance/portale/dispatcher?from=rfc&pathname=%2Fapps%2Ftsf%2Fdata%2FeCompliance%2FeCRepository%2Frfc%2F0098.06%2F98.6.zip 中定义的标准 RFC xsd),带有一个

<complexType name="EventoClinico">
    ...
    <sequence>
...
        <element name="Corpo" type="sisrt:Corpo" minOccurs="0" />
    </sequence>
        ...
</complexType>

而“Corpo”是

<complexType name="Corpo">
    <sequence>
        <any namespace="##any" processContents="lax" />
    </sequence>
</complexType>

xsd.exe 工具将 Corpo 元素转换为

public XmlElement Corpo;

财产。

问题是:

如何用我的自定义类填充属性:

public class Example{

public string AString {get;set;}
}

如何设置 EventoClinico.Corpo = new Example("a string");?

许多问候。

弗朗切斯科。

这是以下帖子中建议的解决方案:

public XmlElement Convert<TObj>(TObj obj) { 
        XmlSerializer s = new XmlSerializer(typeof(TObj)); 
        StringBuilder sb = new StringBuilder();
        XmlWriterSettings settings= new XmlWriterSettings();
        //settings.ConformanceLevel=ConformanceLevel.Fragment;
        settings.OmitXmlDeclaration=true;
        XmlWriter w = XmlWriter.Create(sb, settings);
        s.Serialize(w, obj); 
        return ToXmlElement(sb.ToString());
    }

    public XmlElement ToXmlElement(string xml)
    {
        XmlDocumentFragment frag = new XmlDocument().CreateDocumentFragment();
        frag.InnerXml = xml;
        return frag.FirstChild as XmlElement;
    }

【问题讨论】:

    标签: c# serialization xsd.exe any


    【解决方案1】:

    由于 any 不是严格定义的类型,xsd.exe 为其生成 XmlElement。

    http://msdn.microsoft.com/en-us/library/2w8zbwa2(v=vs.80).aspx

    如果你想把值放在那里,你需要使用 Attributes 和 ChildNodes 集合。

    您可以让您的测试类从 XmlElement 继承,并使用 get 和 set 属性来保持 ChildNodes 和 Attributes 与您的成员数据同步。

    public class Example : XmlElement {
    
    public string AString {
        get { return GetAttribute("astring"); }
    
        set { SetAttribute("astring", value); }
    }
    
    }
    

    【讨论】:

    • 你能给我一个你在想什么的例子吗?看起来是正确的方法。问候。
    • 将此标记为解决方案(小复选标记) - 让其他人知道该解决方案有效,并鼓励回答者关注您的问题。
    • 我想我还需要一个构造函数 public Example(string prefix, string localName, string namespaceURI, XmlDocument doc) :base(prefix, localName, namespaceURI, doc) { }
    • 听起来不错。编写该示例时,我并没有靠近带有 C# 编译器的机器。
    【解决方案2】:

    嗯...您的架构似乎有问题,我认为 type="sisrt:Corpo" 应该是 type="Corpo" (因为它定义为 )?

    另外,如果 EventoClinico 和 Corpo 定义在不同的 .xsd 文件中,您可能需要使用 指令

    【讨论】:

    • 感谢您的回复,但这是对真实 XSD 的简化(您可以在编辑的链接上找到它),并且 XSD 不能更改,因为它是一个标准。关键是如何将实体传递给 XmlElement 字段?
    • 不确定,也许你可以试试:public XmlElement Convert&lt;TObj&gt;(TObj obj) { XmlSerializer s = new XmlSerializer(typeof(TObj)); StringBuilder sb = new StringBuilder(); XmlWriter w = XmlWriter.Create(sb); s.Serialize(w, obj); XmlDocument xe = new XmlDocument(); xe.ReadNode(XmlReader.Create(new StringReader(sb.ToString())); return (XmlElement)xe.ChildNodes[0]; }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多