targetNamespace и xmlns без префикса, в чем разница?



в документе схемы xml, если у меня есть как targetNamespace, так и xmlns без префикса.



<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
targetNamespace="http://example.com/" xmlns="http://example.com/">


какова точная разница между ними? Я понимаю, что если у вас есть xmlns без префикса, все элементы без префикса получают это пространство имен и...смутно то же самое касается targetNamespace.

2407   5  

5 ответов:

targetNamespace - это XML-схема "артефакт"; его цель: указать, какое конкретное пространство имен XML описывает файл схемы.

xmlns - поскольку XML-схема является XML-документом, то можно определить пространство имен XML по умолчанию для самого XML-файла (это то, что делает атрибут xmlns); последствия являются множественными: создание и композиция. Например, не нужно использовать префикс для элементов, определенных в схеме, которые позже упоминаются в другом месте того же файла (например, глобальный тип simpleType, используемый в качестве типа для атрибута или элемента).

по моему опыту, многие авторы XML-схемы считают это "лучшей практикой"... так что вы на правильном пути.

в терминах XSD, targetNamespace предписывает часть пространства имен полного имени компонента схемы, который включает элементы, атрибуты, группы и группы атрибутов, а также простые и сложные типы. Некоторые из них полные имена, определенные в XSD (элементы и атрибуты), "непосредственно" используются документом экземпляра XML. На другие, например для типов, можно ссылаться через атрибут xsi:тип атрибут в экземпляре XML-документов. Остальные (группы, группы атрибутов) существуют для облегчения композиции схемы (через ссылки).

Я также считаю ,что (в целом) люди приходят к разработке XSD с двух сторон:

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

  • чисто моделирование. Затем вы думаете о targetNamespace, похожем на пакет UML, или схему базы данных, или пакет Java, или пространство имен .NET, и все это означает в этом случае. По сути, это механизм для предотвращения коллизий имен; тем не менее, это также механизм для разделения моделей в предметных областях, так далее.

для тех, кто все еще смущен, рассмотрим эти три xsds. Все они определяют один глобальный тип и одно глобальное определение элемента, которое ссылается на него.

во-первых, xsd, как тот, который размещен выше. Он использует префикс xsd-схемы для схема пространство имен и пространство имен по умолчанию для атрибута targetnamespace:

<xsd:schema 
  xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
  targetNamespace="http://example.com/" 
  xmlns="http://example.com/">

  <xsd:element name="aGlobalElement" type="aGlobalType"/>

  <xsd:simpleType name="aGlobalType">
    <xsd:restriction base="xsd:string"/>
  </xsd:simpleType>   
</xsd:schema>  

Теперь тот же xsd, но определение и использование префикса пространства имен для целевого пространства имен:

<xsd:schema 
  xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
  targetNamespace="http://example.com/" 
  xmlns:tns="http://example.com/">

  <xsd:element name="aGlobalElement" type="tns:aGlobalType"/>

  <xsd:simpleType name="aGlobalType">
    <xsd:restriction base="xsd:string"/>
  </xsd:simpleType> 
</xsd:schema>  

...и, наконец, версия, которая использует пространство имен по умолчанию вместо " xsd " для пространства имен схемы XML:

<schema 
  xmlns="http://www.w3.org/2001/XMLSchema" 
  targetNamespace="http://example.com/" 
  xmlns:tns="http://example.com/">

  <element name="aGlobalElement" type="tns:aGlobalType"/>

  <simpleType name="aGlobalType">
    <restriction base="string"/>
  </simpleType>
</schema>

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

xmlns

атрибут xmlns задает пространство имен по умолчанию для описываемого элемента. Таким образом, пространство имен по умолчанию применяется ко всем элементам внутри описанного элемента, которые явно не объявляют другое пространство имен для себя.

пространство имен по умолчанию имеет стандартное значение для файлов WSDL:http://www.w3.org/ns/wsdl

targetNameSpace

этот атрибут содержит пространство имен веб-сервиса. Вы можете свободно выбирать это пространство имен, но есть соглашение, в котором говорится, что URI должен указывать на WSDL службы.

xmlns:tns

Это пространство имен должно иметь тот же URI, что и атрибут targetNameSpace. Таким образом, вы можете ссылаться на целевое пространство имен через этот префикс пространства имен (tns).

Источник:http://tutorials.jenkov.com/wsdl/description.html

targetNamespace - это атрибут schema элемент определяет пространство имен, т. е. пакет в XSD-файле. По соглашению мы используем URI / URL, но мы могли бы использовать любую строку.

xmlns атрибут используется для ссылки на элементы и типы данных, которые поступают из значения атрибута xmlns для текущей области элемента.

Например:

  • xmlns:xsd="http://www.w3.org/2001/XMLSchema" с префиксом как xsd означает, что пространство имен должно начинаться с xsd:
  • xmlns="http://www.w3.org/2001/XMLSchema" без префикса по умолчанию
  • xmlns:p="http://www.example.com/People" есть с приставкой как p означает, что пространство имен должно начинаться с p:

здесь xmlns:xsd и xmlns:p являются QNames и xmlns - это местное название.

следующее изображение помогает понять XSD, используя аналогию Java в соответствии с моими знаниями:

enter image description here

после некоторого тщательного тестирования с помощью xmllint Я думаю, что нашел определенное объяснение здесь. Рассмотрим следующую схему:

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema
version="1.0"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://yyyzzz.com"
xmlns:p="http://abced.com"
xmlns:q="http://pqr.com"
xmlns="http://yyyzzz.com">

<xsd:element name="recipe" type="recipeType" />

<xsd:complexType name="recipeType">
    <xsd:simpleContent>
        <xsd:extension base="xsd:string">
        <xsd:attribute name="desc" type="xsd:string"  />
        <xsd:attribute name="archetype" type="xsd:string" />
        </xsd:extension>
    </xsd:simpleContent>
</xsd:complexType>
</xsd:schema>

приведенная выше схема проверяет следующий документ:

<?xml version="1.0"?>

<recipe xmlns="http://yyyzzz.com">
    Deciphering the purpose of targetNamespace
</recipe>

причина, которая работает, потому что xmlns="http://yyyzzz.com" автоматически привязывается к элементу, определяемому схемой тоже! Это означает, что он также привязывается к recipeType элемент.

Теперь, с тем же xml документ, но с немного измененной схемой, как показано ниже, также проверяет и внимательно изучает разницу:

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema
version="1.0"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://yyyzzz.com"
xmlns="http://eigenfield.aparicio.com"
xmlns:EGboy="http://yyyzzz.com">

<xsd:element name="recipe" type="EGboy:recipeType" />

<xsd:complexType name="recipeType">
    <xsd:simpleContent>
        <xsd:extension base="xsd:string">
        <xsd:attribute name="desc" type="xsd:string"  />
        <xsd:attribute name="archetype" type="xsd:string" />
        </xsd:extension>
    </xsd:simpleContent>
</xsd:complexType>

</xsd:schema> 

игнорировать, если другой xmlns пропал, но вместо этого посмотрите внимательно на type= "EGboy: recipeType". Мы больше не можем полагаться на xmlns потому что он имеет другое значение, поэтому мы должны поставить префикс EGboy перед recipeType.

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

Comments

    Ничего не найдено.