2009-08-19 2 views
1

Я думаю, что решение моей проблемы очень легко, но я не мог финт его Так вот:XML Schema: Различные имена элементов (последовательность)

У меня есть XML, которые есть список элементов с разными именами, но последовательно. Пример:

<DOC> 
<DOC_OBL_1> 
    <TIP_DOC_OBL>1</TIP_DOC_OBL> 
</DOC_OBL_1> 
<DOC_OBL_2> 
    <TIP_DOC_OBL>2</TIP_DOC_OBL> 
</DOC_OBL_2> 
<DOC_OBL_3> 
    <TIP_DOC_OBL>3</TIP_DOC_OBL> 
</DOC_OBL_3> 
</DOC> 

Таким образом, у меня есть 3 элемента: DOC_OBL_1, DOC_OBL_2 и DOC_OBL_3. И да, может быть число 4, 5, 6 и т. Д. Как вы можете, все 3 имеют одинаковые элементы внутри (на самом деле у них их много, но arent important righ сейчас), и я подумал, что могу объявить общий тип, который мог бы подтвердить этот вид документов.

Как я могу проверить это с помощью схемы?

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

ответ

2

Ну, конечно, вы можете! Довольно просто на самом деле: если структура одинакова для каждого элемента, вы можете определить один <xs:complexType> для проверки, что, а затем использовать:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema id="DOC" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="DOC"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="DOC_OBL_1" type="DocType" /> 
     <xs:element name="DOC_OBL_2" type="DocType" /> 
     <xs:element name="DOC_OBL_3" type="DocType" /> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
    <xs:complexType name="DocType"> 
    <xs:sequence> 
     <xs:element name="TIP_DOC_OBL" type="xs:string" minOccurs="0" /> 
    </xs:sequence> 
    </xs:complexType> 
</xs:schema> 

ли эту работу для вас? Он справляется со всеми вашими потребностями?

Как замечает Зак - это «решение», очевидно, весьма ограничено, поскольку оно не может иметь дело с произвольным числом тегов DOC_OBL_1, DOC_OBL_2, ...., DOC_OBL_x - имя и, следовательно, количество теги должны быть известны заранее.

Это несчастливо, но это единственное решение, учитывая этот искаженный XML. РЕАЛ решение будет иметь что-то вроде:

<DOC> 
    <DOC_OBL id="1"> 
    </DOC_OBL> 
    <DOC_OBL id="2"> 
    </DOC_OBL> 
    ..... 
    <DOC_OBL id="x"> 
    </DOC_OBL> 
</DOC> 

и затем XML-схема станет еще проще и может справиться с любым количеством <DOC_OBL> тегов.

Но применим принцип GIGO: Garbage In, Garbage Out ==> Crappy XML-структура входит, возможна только дрянная, неполная проверка.

Марк

+1

@marc_s, если может быть любое количество узлов DOC \ _OBL \ _1, DOC \ _OBL \ _2, DOC \ _OBL \ _N, есть способ проверить, что схема, выполняющая какое-то регулярное выражение, против имени элемента ? –

+0

Нет, это, к сожалению, невозможно, я боюсь. Вы можете иметь только фактическое имя тега в качестве имени элемента, или тогда вы должны иметь фиксированное имя тега и переменную часть (порядковый номер) в атрибуте этого тега. –

+0

Спасибо. Я думаю, что Im собирается сделать это, по крайней мере, с 50 элементами (DOC_OBL_1 ... DOC_OBL_50). Уродливый вход -> уродливое решение ..: D Но все равно работает. – eLZahR

2

Его несчастные, что имена XML-элементов имеют в основном порядковые номера/идентификаторы в них. Я бы сказал, что это плохо определенный (не стандартный) XML.

В моем ограниченном (!) Опыте это означает, что схема xsd должна иметь все возможные элементы «DOC_OBL_N», определенные в последовательности. Это, вероятно, нецелесообразно, если нет теоретического верхнего предела их числа.

До тех пор, пока его действительный xml, вы можете загрузить его и подсчитать все дочерние элементы элемента DOC, а затем написать схему на лету, но это звучит как ее саморазрушение.

Это может привести к тому, что вы вручную проверите экземпляр xml с помощью некоторого xpaths - своего рода подход грубой силы и не будете технически проверять схему xsd.

+0

Вход представляет собой огромный документ, поэтому больше кода, чем простой Schmea, не является жизнеспособным. – eLZahR