Как установить пространство имен только для первого тега с XOM? - PullRequest
2 голосов
/ 08 июля 2010

Я использую XOM для создания XML-документов на Java.

Я создал простой документ XML и хочу пространство имен XML. Но когда я устанавливаю пространство имен для первого тега, на дочерних объектах устанавливается пустое пространство имен, например xmlns="", как я могу избавиться от этого поведения? Я хочу только xmlns для первого тега.

Я хочу этот XML:

<request xmlns="http://my-namespace">
    <type>Test</type>
    <data>
        <myData>test data</myData>
    </data>
</request>

Но это вывод XML-документа из XOM

<request xmlns="http://my-namespace">
    <type xmlns="">Test</type>
    <data xmlns="">
        <myData>test data</myData>
    </data>
</request>

Это мой код Java XOM:

String namespace = "http://my-namespace";
Element request = new Element("request", namespace);

Element type = new Element("type");
type.appendChild("Test");

request.appendChild(type);

Element data = new Element("data");
request.appendChild(data);

Element myData = new Element("myData");
myData.appendChild("test data");
data.appendChild(myData);

Document doc = new Document(request);
doc.toXML();

Ответы [ 3 ]

8 голосов
/ 08 июля 2010

Это работает для меня.Однако, я немного озадачен тем, почему объекты Element не наследуют пространство имен своих родителей.(Не эксперт по XML или XOM)

Код:

String namespace = "http://my-namespace";
Element request = new Element("request", namespace);

Element type = new Element("type", namespace);
type.appendChild("Test");

request.appendChild(type);

Element data = new Element("data", namespace);
request.appendChild(data);

Element myData = new Element("myData", namespace);
myData.appendChild("test data");
data.appendChild(myData);

Document doc = new Document(request);
System.out.println(doc.toXML());

Вывод:

<?xml version="1.0"?>
<request xmlns="http://my-namespace">
  <type>Test</type>
  <data>
    <myData>test data</myData>
  </data>
</request>
2 голосов
/ 27 июля 2011

Я столкнулся с той же проблемой, и Google привел меня сюда.

@ Майкл - Это то, что говорится в javadoc, да, но, к сожалению, это не так, когда вы его реализуете.Дочерние элементы будут продолжать получать пустые атрибуты xmlns, если вы не выполните реализацию Catchwa.

Реализация Catchwa работает просто отлично.Только элемент, о котором я говорю, имеет пространство имен, имеет пространство имен.Все пустые атрибуты xmlns исчезли.Это странно.

Это ошибка?Я не могу понять эту часть.Или XOM работает так же?

1 голос
/ 25 марта 2016

Не путайте пространства имен и объявления пространств имен. Пространство имен является внутренним свойством каждого элемента. Объявление пространства имен является атрибутом `xmlns '. Они не одно и то же, хотя они связаны. Когда вы создаете элемент, вы устанавливаете его пространство имен, а не его объявление пространства имен.

В моделях данных XOM пространства имен не являются атрибутами. Они являются неотъемлемым свойством самого элемента. В XML нет правила, согласно которому дочерние элементы элемента должны находиться в том же пространстве имен, что и родительский элемент. Действительно, теоретически каждый элемент в документе может находиться в другом пространстве имен.

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

Когда документ сериализуется, пространства имен представляются атрибутами xmlns и xmlns:*prefix*. XOM выясняет, куда поместить эти элементы, чтобы они соответствовали пространствам имен, назначенным для каждого элемента. Просто укажите пространство имен, которое вы хотите для каждого элемента в вашем коде, и позвольте XOM выяснить, куда поместить объявления пространства имен.

...