Java+DOM: Как я устанавливаю основное пространство имен (уже созданный) Документ?

Вы могли выполнить его через жемчуг.

export CLEANSTRING=$(perl -e 'print join( q//, map { s/\\s+/_/g; lc } split /[^\\s\\w]+/, \$ENV{STRING} )')

я использую подоболочку ksh-стиля здесь, я не полностью уверен, что она работает в ударе.

Это - хорошая вещь об оболочке, то, что можно использовать жемчуг, awk, sed, grep....

18
задан ivan_ivanovich_ivanoff 29 September 2009 в 14:09
поделиться

2 ответа

Помимо установки префикса, вы также должны объявить где-нибудь свое пространство имен.

[EDIT] Если вы посмотрите на пакет org.w3c.dom , вы заметите, что нет никакой поддержки пространств имен, за исключением того, что вы можете создать узел документа с URI пространства имен:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder builder = factory.newDocumentBuilder();
DOMImplementation DOMImplementation = builder.getDOMImplementation();
Document doc = DOMImplementation.createDocument(
    "http://www.somecompany.com/2005/xyz", // namespace
    "root",
    null /*DocumentType*/);

Element root = doc.getDocumentElement();
root.setPrefix("xyz");
root.setAttribute(
    "xmlns:xyz",
    "http://www.somecompany.com/2005/xyz");

Со стандартным API W3C DOM Java 5 (и выше) невозможно изменить пространство имен узла.

Но W3C DOM API - это всего лишь пара интерфейсов. Итак, что вы должны попробовать, так это посмотреть на реализацию (то есть на фактический класс вашего экземпляра документа), привести его к реальному типу. У этого типа должны быть дополнительные методы, и если вам повезет, вы можете использовать их для изменения пространства имен.

7
ответ дан 30 November 2019 в 08:53
поделиться

Ну, вот рекурсивное "решение":
(я все еще надеюсь, что кто-то может найти лучший способ сделать это)

public static void renameNamespaceRecursive(Document doc, Node node,
        String namespace) {

    if (node.getNodeType() == Node.ELEMENT_NODE) {
        System.out.println("renaming type: " + node.getClass()
            + ", name: " + node.getNodeName());
        doc.renameNode(node, namespace, node.getNodeName());
    }

    NodeList list = node.getChildNodes();
    for (int i = 0; i < list.getLength(); ++i) {
        renameNamespaceRecursive(doc, list.item(i), namespace);
    }
}

Кажется, работает, хотя я не знать, правильно ли переименовывать только тип узла ELEMENT_NODE , или если необходимо переименовать другие типы узлов.

3
ответ дан 30 November 2019 в 08:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: