Как изменить XmlSchemaElement.SchemaType (или: разница между SchemaType и ElementSchemaType) - PullRequest
0 голосов
/ 17 апреля 2009

Я работаю над редактором XML, который получает всю свою информацию из соответствующего файла XSD. Для работы с файлами XSD я использую пространство имен System.Xml.Schema (XmlSchema *). Из-за атрибута «xsi: type» в XML я должен изменить XmlSchemaType для XmlSchemaElement. До сих пор я использовал в своем коде свойство ' ElementSchemaType ' элемента 'XmlSchemaElement'. Хорошая вещь об этом: это только для чтения .

Также в 'XmlSchemaElement' есть свойство ' SchemaType ', которое не только для чтения , но всегда пустое (да, XmlSchema и XmlSchemaSet скомпилированы).

Так как я могу изменить тип «XmlSchemaElement»? Или также тот же вопрос: какова разница между этими двумя характеристиками?

Некоторые технические данные: C #, .NET 3.5

Документация MSDN практически одинакова для обоих:

Документация по SchemaType:

Получает или задает тип элемента. Это может быть сложный тип или простой тип.

Документация ElementSchemaType:

Получает объект XmlSchemaType, представляющий тип элемента, на основе значений элемента SchemaType или SchemaTypeName.

1 Ответ

0 голосов
/ 17 апреля 2009

Хорошо, я нашел (плохое) решение с помощью Reflection:

private static string XML_SCHEMA_ELEMENT_SET_ELEMENT_TYPE_MEMBER_NAME = "SetElementType";

public static void ChangeElementType(this XmlSchemaElement element, XmlSchemaType type)
{
        element.GetType().InvokeMember(XML_SCHEMA_ELEMENT_SET_ELEMENT_TYPE_MEMBER_NAME,
            BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance,
            null, element, new object[] { type });
}

Я провел анализ с .NET Reflector, и у них есть два свойства, которые содержат XmlSchemaType. Один, не только для чтения, предназначен для сериализации XML (он имеет атрибуты Xml *), а другой, который предназначен только для чтения, - как я думаю, для использования после компиляции - так что это более или менее «статическая» информация. Хорошая вещь в этом великолепном дизайне: вы не можете точно прочитать XSD, изменить некоторые части и сохранить его снова. Хорошо, я не проверяю это, но это то, что говорит мне Кодекс.

Итак, вот интересные части исходного кода XmlSchemaElement:

private XmlSchemaType elementType;
// ...
private XmlSchemaType type;
// ...
[XmlIgnore]
public XmlSchemaType ElementSchemaType
{
    get
    {
        return this.elementType;
    }
}
// ...
[XmlElement("complexType", typeof(XmlSchemaComplexType)), XmlElement("simpleType", typeof(XmlSchemaSimpleType))]
public XmlSchemaType SchemaType
{
    get
    {
        return this.type;
    }
    set
    {
        this.type = value;
    }
}
// ...
internal void SetElementType(XmlSchemaType value)
{
    this.elementType = value;
}
...