2011-08-23 2 views
0

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

Я бы хотел написать простую схему для этого файла. Я думаю, что он должен выполнить два основных условия:

  • каждый элемент может иметь атрибуты из определенного списка (например, имя, значение, тип [там будет гораздо больше!])
  • каждый элемент может иметь последовательность элементов точное определение

Если будет возможность сделать список атрибутов, зависящий от некоторого заданного (например, типа) аргумента, это будет очень полезно.

Могут ли файлы XSD обрабатывать эти XML-файлы? Можно ли написать такую ​​схему? Как определить список атрибутов любого узла.

ответ

0

Вам нужно определить тип XSD для каждой из возможных комбинаций элементов и атрибутов, которые вы хотите поддерживать в экземплярах xml. Например,

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="root"> 
    <xs:complexType> 
     <xs:all> 
     <!-- declarations of any of the types you can use --> 
     <xs:element name="MyType1" type="MyType1Type" /> 
     <!-- etc.. --> 
     </xs:all> 
    </xs:complexType> 
    </xs:element> 
    <!-- Type definitions --> 
    <xs:complexType name="MyType1> 
    <xs:sequence> 
     <xs:element name="MyElement1" type="xs:string" /> 
     <xs:element name="MyElement2" type="xs:date" /> 
     <!-- etc.. --> 
    </xs:sequence> 
    <xs:attribute name="MyAttribute1" type="xs:string" /> 
    <!-- etc.. --> 
    </xs:complexType> 
    <xs:complexType name="MyType2> 
    <xs:sequence> 
     <xs:element name="MyElement3" type="xs:string" /> 
     <xs:element name="MyElement4" type="xs:date" /> 
     <!-- etc.. --> 
    </xs:sequence> 
    <xs:attribute name="MyAttribute3" type="xs:string" /> 
    <!-- etc.. --> 
    </xs:complexType> 
    <!-- etc.. --> 
</xs:schema> 

После того как вы определили все возможные типы, вы можете поддерживать любой XML-файл.

Надеется, что это помогает

Edit: Или использовать хз: тип anyType.

+0

, к сожалению, , так как я сказал, что имя узла не предоставляет никакой информации. Разработчик может вставить здесь абсолютно все, поэтому список имен элементов невозможен. –

+0

Тогда вам нужно использовать xs: anyType type. –

+0

Можете ли вы привести пример условий, о которых я упоминал? –

0

У вас может быть схема, которая определяет только complexType со всеми атрибутами. Ваша задача тогда - найти процессор схемы, API которого позволяет запросить проверку данного входного элемента на этот именованный тип. Один из способов сделать это с схемой-Aware процессор XSLT: (. И производит много продукции, которую можно отбросить)

<xsl:template match="*"> 
    <xsl:copy-of select="." type="my-complex-type"/> 
    <xsl:apply-templates/> 
</xsl:template> 

будет проверять каждый элемент в документе против вашего объявления типа

+0

мои возможности ограничены, потому что я только расширяю существующие классы, которые в настоящее время обрабатывают только xsd. Очень жаль:( –

Смежные вопросы