1

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

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

和“公司”是

<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;
    }
4

2 回答 2

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); }
}

}
于 2011-11-14T19:36:24.820 回答
0

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

此外,如果 EventoClinico 和 Corpo 定义在不同的 .xsd 文件中,您可能需要使用 <xs:include schemaLocation="anotherfile.xsd" /> 指令

于 2011-11-14T17:08:46.340 回答