Xsd.exe任何Type to XmlElement转换。如何填补生成的财产?

时间:2011-11-14 16:58:35

标签: c# serialization xsd.exe any

我有一个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示例(“一个字符串”);?

许多问候。

弗朗西斯。

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

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

2 个答案:

答案 0 :(得分:1)

由于任何不是严格定义的类型,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); }
}

}

答案 1 :(得分:0)

嗯...你的架构似乎有问题,我认为type =“sisrt:Corpo”shold是type =“Corpo”(因为它定义为&lt; complexType name =“Corpo”&gt;)?

此外,如果在不同的.xsd文件中定义了EventoClinico和Corpo,则可能需要使用&lt; xs:include schemaLocation =“anotherfile.xsd”/&gt;指令