XSD: определите элемент с любым именем

Из-за ограничений некоторых систем нам приходится использовать XML-файлы, формат которых несколько неудобен. Те нам нужно преобразовать в удобную форму.

Вопрос: как мне определить в схеме XSD элемент, который имеет следующие свойства:

  • Не имеет детей
  • Не имеет атрибутов
  • Имеет любое имя (именно это вызывает проблемы)

person GSerg    schedule 18.01.2010    source источник
comment
Это невозможно с XSD .. :-|   -  person InfantPro'Aravind'    schedule 19.01.2010
comment
Это невозможно только с xsd - документ экземпляра xml должен ограничивать тип элементов.   -  person Filburt    schedule 29.01.2010


Ответы (1)


Вы можете использовать элемент ‹xsd:any /› вместе с Атрибут типа экземпляра схемы XML.

Схема

<?xml version="1.0" encoding="utf-8" ?>
<xsd:schema attributeFormDefault="qualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="root">
        <xsd:complexType>
            <xsd:sequence maxOccurs="unbounded">
                <xsd:any processContents="strict" namespace="##local"></xsd:any>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
    <xsd:simpleType name="st">
        <xsd:restriction base="xsd:string" />
    </xsd:simpleType>
</xsd:schema>

Тестовый экземпляр XML

<?xml version="1.0" encoding="utf-8"?>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <!-- valid -->
    <one xsi:type="st">value one</one>
    <emptyone xsi:type="st"/>

    <!-- invalid -->
    <two name="myname" xsi:type="st">value two</two>

    <!-- invalid -->
    <three xsi:type="st">
        <four xsi:type="st">value four</four>
    </three>
</root>

Заключение

Вы не можете принудительно применять простой тип в схеме xsd отдельно.

person Filburt    schedule 18.01.2010
comment
Нет, я не могу. xsd:any допускает произвольную структуру, тогда как я хочу, чтобы элементы с любым именем не имели дочерних элементов или атрибутов. - person GSerg; 18.01.2010
comment
В этом случае похоже, что ваши требования взаимоисключающие. - person Filburt; 18.01.2010
comment
Почему? Это не так, AFAIC. Любой элемент ‹node›value‹/node› подходит, независимо от фактического текста, который заменяет узел, в то время как любой элемент ‹node›‹child/›‹/node› не подходит. - person GSerg; 19.01.2010
comment
Да, потому что, очевидно, не существует способа ограничить элемент с любым именем. - person Filburt; 28.01.2010
comment
Хорошо, это, вероятно, самое близкое, что может быть. Несмотря на то, что я не контролирую эти XML-файлы, я не могу заставить их иметь атрибут. - person GSerg; 06.02.2010