Чистая обработка пространства имен с dom4j

Необходимо послать электронные письма HTML. С <br /> с в электронном письме, у Вас всегда будут свои разрывы строки.

8
задан Antoine Claval 14 September 2009 в 15:48
поделиться

2 ответа

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

Вариант 2 может быть применен рекурсивно, но он имеет многие из тех же проблем, что и вариант 1.

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

Лучший способ - заставить того, кто отправляет вам плохой XML, исправить его. Конечно, возникает вопрос, действительно ли он сломан. В частности, получаете ли вы XML, в котором пространство имен по умолчанию определено как X, а затем пространству имен, также представляющему X, дается префикс es? Если это так, то XML сформирован правильно, и вам просто нужен код, который не зависит от префикса, но по-прежнему использует квалифицированное имя для выборки элемента. Я'

1
ответ дан 5 December 2019 в 14:04
поделиться

Ниже приведен код, который я нашел и теперь использую. Может быть полезно, если вы ищете общий способ удаления всех пространств имен из документа dom4j.

    public static void removeAllNamespaces(Document doc) {
        Element root = doc.getRootElement();
        if (root.getNamespace() !=
                Namespace.NO_NAMESPACE) {            
                removeNamespaces(root.content());
        }
    }

    public static void unfixNamespaces(Document doc, Namespace original) {
        Element root = doc.getRootElement();
        if (original != null) {
            setNamespaces(root.content(), original);
        }
    }

    public static void setNamespace(Element elem, Namespace ns) {

        elem.setQName(QName.get(elem.getName(), ns,
                elem.getQualifiedName()));
    }

    /**
     *Recursively removes the namespace of the element and all its
    children: sets to Namespace.NO_NAMESPACE
     */
    public static void removeNamespaces(Element elem) {
        setNamespaces(elem, Namespace.NO_NAMESPACE);
    }

    /**
     *Recursively removes the namespace of the list and all its
    children: sets to Namespace.NO_NAMESPACE
     */
    public static void removeNamespaces(List l) {
        setNamespaces(l, Namespace.NO_NAMESPACE);
    }

    /**
     *Recursively sets the namespace of the element and all its children.
     */
    public static void setNamespaces(Element elem, Namespace ns) {
        setNamespace(elem, ns);
        setNamespaces(elem.content(), ns);
    }

    /**
     *Recursively sets the namespace of the List and all children if the
    current namespace is match
     */
    public static void setNamespaces(List l, Namespace ns) {
        Node n = null;
        for (int i = 0; i < l.size(); i++) {
            n = (Node) l.get(i);

            if (n.getNodeType() == Node.ATTRIBUTE_NODE) {
                ((Attribute) n).setNamespace(ns);
            }
            if (n.getNodeType() == Node.ELEMENT_NODE) {
                setNamespaces((Element) n, ns);
            }            
        }
    }

Надеюсь, это будет полезно для тех, кому это нужно!

5
ответ дан 5 December 2019 в 14:04
поделиться
Другие вопросы по тегам:

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