Xsd.exe Любой тип преобразования в XmlElement.Как заполнить сгенерированное свойство? - PullRequest
1 голос
/ 14 ноября 2011

У меня XSD (Это стандартный RFC xsd, как определено в http://web.rete.toscana.it/eCompliance/portale/dispatcher?from=rfc&pathname=%2Fapps%2Ftsf%2Fdata%2FeCompliance%2FeCRepository%2Frfc%2F0098.06%2F98.6.zip) с

<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 Element в свойство

public XmlElement Corpo;

.

Вопрос:

Как мне заполнить свойство своим пользовательским классом:

public class Example{

public string AString {get;set;}
}

Как установить EventoClinico.Corpo = new Example ("строка");?

С уважением.

Франческо.

Вотрешение, как предлагается в следующих сообщениях:

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 ]

1 голос
/ 14 ноября 2011

Поскольку любой не имеет строго определенного типа, xsd.exe создает для него XmlElement.

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

Если вы хотите поместить туда значениявам нужно будет использовать коллекции Attributes и ChildNodes.

Вы можете сделать так, чтобы ваш тестовый класс наследовал от XmlElement и использовать get и набор его свойств, чтобы синхронизировать ChildNodes и Attributes с данными вашего члена.

public class Example : XmlElement {

public string AString {
    get { return GetAttribute("astring"); }

    set { SetAttribute("astring", value); }
}

}
0 голосов
/ 14 ноября 2011

Хм ... кажется, что-то не так с вашей схемой, я думаю type = "sisrt: Corpo" shold be type = "Corpo" (потому что он определен как )?

Кроме того, если EventoClinico и Corpo определены в разных файлах .xsd, вам может потребоваться использовать директиву

...