#xml #xml-namespaces
#xml #xml-пространства имен
Вопрос:
Существует ли термин или стандарт для использования локальных пространств имен в документе XML? Например, я хотел бы отделить элемент отображения от Rows
and Columns
и поэтому я просто делаю:
<Data xmlns:R="Rows" xmlns:C="Columns" xmlns:V="Values">
<R:ProductGroup value="Electronics">
<R:Product value="Computer">
<C:Year value="2018">
<V:SumOfRevenue value="104" />
<V:SumOfUnits value="3" />
</C:Year>
<C:Year value="2019">
<V:SumOfRevenue value="82" />
<V:SumOfUnits value="9" />
</C:Year>
<C:Year value="(all)">
<V:SumOfRevenue value="186" />
<V:SumOfUnits value="12" />
</C:Year>
</R:Product>
</R:ProductGroup>
</Data>
Это намного проще, чем искажать имена, такие как «Rows_Product» и т. Д. Но мне было интересно, какова практика использования «локального» пространства имен, которое ничего не означает за пределами текущего документа, и если это обычная практика (и если да, то каким предложениям следует следовать)?
Ответ №1:
В XML нет «локальных» пространств имен. Существуют пространства имен. И вы можете создать столько из них, сколько захотите, где захотите. Некоторые из них широко известны (например, для XSLT или XHTML), некоторые из них нет. Технически все они равны.
Но целью пространств имен является разделение узлов, принадлежащих разным доменам, чтобы предотвратить конфликты имен (что делает XML составным) и упростить выбор и обработку узлов данного домена (например //xhtml:*
, выбрать все узлы XHTML).
То, что вы пытаетесь здесь сделать, это объединить данные с семантикой отображения, и это не очень хорошая идея, независимо от того, делаете ли вы это, используя пространства имен или «искаженные» имена.
Ваши данные — это
<Data>
<ProductGroup value="Electronics">
<Product value="Computer">
<Year value="2018">
<SumOfRevenue value="104" />
<SumOfUnits value="3" />
</Year>
<Year value="2019">
<SumOfRevenue value="82" />
<SumOfUnits value="9" />
</Year>
<Year value="(all)">
<SumOfRevenue value="186" />
<SumOfUnits value="12" />
</Year>
</Product>
</ProductGroup>
</Data>
Не указывайте в XML-структуре, какие из этих элементов должны отображаться в виде строк или столбцов, эти вещи не имеют ничего общего друг с другом. Вы же не хотите переписывать свой XML только потому, что кто-то решил, что таблица теперь должна отображаться горизонтально, а не вертикально, или что она должна стать списком.
Пусть XML передает данные, пусть компонент представления вашего приложения решает, как лучше всего их отобразить.
Комментарии:
1. Технически существуют пространства имен и не-пространства имен; элементы в этом примере технически имеют имена, которых нет в пространстве имен. Его часто называют «нулевым пространством имен», но это технически неверно, потому что на самом деле это не пространство имен. Я иногда называю это «не-пространством имен», но на самом деле у него нет имени, потому что оно на самом деле не существует…
Ответ №2:
Пространства имен не были предназначены для использования так, как вы их используете. С таким документом намного проще либо вообще избегать использования пространств имен, либо помещать все в одно и то же пространство имен с объявлением xmlns=»….» вверху.