Необходимо послать электронные письма HTML. С <br />
с в электронном письме, у Вас всегда будут свои разрывы строки.
Вариант 1 опасен, потому что вы не можете гарантировать префиксы для данного пространства имен без предварительного анализа документа. , и потому что вы можете столкнуться с конфликтом пространств имен. Если вы используете документ и ничего не выводите, это может быть нормально, в зависимости от источника документа, но в противном случае он просто теряет слишком много информации.
Вариант 2 может быть применен рекурсивно, но он имеет многие из тех же проблем, что и вариант 1.
Вариант 3 звучит как лучший подход, но вместо того, чтобы загромождать ваш код, сделайте статический метод, который выполняет обе проверки, а не помещает один и тот же оператор if во всю вашу кодовую базу.
Лучший способ - заставить того, кто отправляет вам плохой XML, исправить его. Конечно, возникает вопрос, действительно ли он сломан. В частности, получаете ли вы XML, в котором пространство имен по умолчанию определено как X, а затем пространству имен, также представляющему X, дается префикс es? Если это так, то XML сформирован правильно, и вам просто нужен код, который не зависит от префикса, но по-прежнему использует квалифицированное имя для выборки элемента. Я'
Ниже приведен код, который я нашел и теперь использую. Может быть полезно, если вы ищете общий способ удаления всех пространств имен из документа 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);
}
}
}
Надеюсь, это будет полезно для тех, кому это нужно!