Почему мне нужно добавить префикс XML к элементу x :? - PullRequest
3 голосов
/ 19 мая 2011

Я видел различные случаи, когда элементы в файле XML имеют префикс x: или что-то еще.

Какова цель этого?

Кроме того, что означает "пространство имен" для xml? (обычно какой-то URL)? как это используется каким-либо образом?

Ответы [ 2 ]

6 голосов
/ 19 мая 2011

"x:" - это псевдоним пространства имен с именем x.Где-то выше этого элемента будет атрибут xmlns: x, указывающий на какой-либо URL, URL-адрес обычно не важен, это просто идентификатор для пространства имен.

"x" - это просто имя, локальное для файла,с тем же успехом это может быть xmlns: foo, если foo: используется везде, где использовался x:.

Пространства имен обычно используются процессорами xml, чтобы убедиться, что они ищут нужные элементы (для преобразований xlst).например), а не пользовательские элементы, определенные пользователем в XML.

Подробнее о пространствах имен XML можно узнать здесь

3 голосов
/ 19 мая 2011

x: - это идентификатор пространства имен в вашем XML. В поддереве XML может быть одно пространство имен по умолчанию для элементов и атрибутов (устанавливается xmlns='...'). Если вам нужны элементы или атрибуты из других пространств имен, вам необходимо определить префикс, например xmlns:x='...'. Элементы и атрибуты, которые вы используете из этого пространства имен, должны иметь префикс x:. Обычный у меня есть

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"

, что требует от меня, чтобы элемент use сделал следующее:

<use xlink:href='#foo'/>

В этом случае элемент use происходит из SVG, а атрибут href - из XLink. Оба отличаются, но в некоторых местах совместимы спецификации.

И это в основном то, для чего нужны пространства имен:

  • Группирует различные виды использования XML в связные части
  • Разрешить их использование в одном XML
  • Потенциально избегайте столкновений имен (если у вас есть два пространства имен, и оба допускают элемент с именем foo, то вам нужно указать , какой из двух foo s вы хотите.

Таким образом, пространства имен мало чем отличаются от того, как они работают во многих языках программирования. Вы можете просматривать вещи, которые вы импортируете, с помощью пространств имен, как библиотеки в приведенном выше случае SVG. Люди, пишущие SVG, заметили, что уже существует спецификация, позволяющая ссылаться на произвольные элементы XML (XLink), и они просто использовали ее повторно. В других случаях, таких как WPF, существуют пространства имен для разделения декларативного пользовательского интерфейса инфраструктуры представления и связующих атрибутов, необходимых для взаимодействия с кодом. Например. окно может выглядеть так:

<Window
    x:Class="W"
    Height='500'
    Width='500'
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

Атрибут Class необходим только для того, чтобы компилятор знал соответствующий класс codebehind, он не имеет видимых различий в окне.

Другим примером является XSLT, где вы определяете преобразования в документах XML. Инструкции XSLT и шаблоны для вывода являются XML. Обычно вы используете явное пространство имен для элементов XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

, чтобы вы могли генерировать сгенерированный XML следующим образом:

<xsl:if test="Content/Chapter">
  <xsl:variable name="text"><xsl:value-of select="$trans//item[@name='content'][lang($lang)]" /></xsl:variable>
  <h2><xsl:value-of select="$text"/></h2>
    <ol>
      <xsl:apply-templates select="Content" mode="TableOfContents"/>
    </ol>
</xsl:if>

Если бы я сделал пространство имен xsl: пространством имен по умолчанию, тогда процессор XSLT не смог бы отличить мой HTML-код от реальных инструкций. Это проблема, если ваш код и данные используют один и тот же формат и живут в одном и том же месте. Я полагаю, что Лисп решил это, пометив данные одинарной кавычкой.

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

...