Да, это может ввести в заблуждение. Когда документ представлен как дерево элементов и других типов узлов, каждый элемент принадлежит определенному пространству имен, независимо от любого другого элемента элемента, даже его предков. Это справедливо для всех «основных» XML-ориентированных API: s (DOM, JDOM, DOM4J и XOM).
Поскольку вы создали элемент LOAD_EVENT, который не имеет пространства имен, но позже добавили объявление узла по умолчанию в узел, DOM4J не имел выбора, кроме как изменить пространство имен для LOAD_EVENT (здесь DOM4J позволяет очень запутанное действие, ИМХО). Однако дочерние узлы все еще не имеют пространства имен (или пустого пространства имен).
Когда вы позже сериализуете дерево в XML, пространство имен по умолчанию, указанное в корневом узле, должно быть «необъявленным» для каждого дочернего элемента.
Я предполагаю, что вы хотите что-то вроде этого:
String NS = "http://www.acme.com/LoadEvent";
Document document = DocumentHelper.createDocument();
Element documentRoot = document.addElement("load", NS);
Element header = documentRoot.addElement("header", NS);
Element body = documentRoot.addElement("documents", NS);
То есть, каждый элемент принадлежит к пространству имен NS.
Другими словами: в API, ориентированном на дерево: s, узел элемента не наследует пространство имен его родителя. Каждый элемент должен быть создан с соответствующим пространством имен, если он есть.
любое решение для этого до сих пор? – ronnyfm