Имя "" недопустимо для пространств имен JDOM/XML

Я использую JDOM2 для извлечения XML, которым я не управляю из удаленных каналов. Для одного из них я получил эту ошибку:

Имя "" недопустимо для пространств имен JDOM/XML: URI пространства имен должны быть ненулевыми и непустыми строками.

Вот пример XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Result xmlns="urn:XYZ" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" attributeA="1" attributeB="2" attributeC="3" xsi:schemaLocation="http://XYZ.com/ZYZ.xsd">
...
</Result>

Если я удалю xsi:schemaLocation с помощью регулярного выражения, эта ошибка исчезнет.

private String stripSchemaLocation(String xml) {
    return xml.replaceAll("xsi:schemaLocation=\"(.+?)\"", "");
}

Вот мой код разбора JDOM2. Это не удается на builder.build

// Schema location is causing problem with some xml.
xml = stripSchemaLocation(xml);

SAXBuilder builder = new SAXBuilder();

//@see http://xerces.apache.org/xerces-j/features.html
builder.setFeature("http://xml.org/sax/features/validation", false);
builder.setFeature("http://xml.org/sax/features/namespaces", false);
builder.setFeature("http://apache.org/xml/features/validation/schema", false);

//@see http://www.jdom.org/docs/faq.html#a0350
builder.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false);
builder.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);

org.jdom2.Document doc2 = builder.build(new InputSource(new StringReader(xml)));

// --Then doing XPath stuff with this XML--

1 ответ

Из JavaDoc: http://www.jdom.org/docs/apidocs/org/jdom2/input/SAXBuilder.html

Кроме того, это никогда не должно быть сделано при использовании JDOM:

builder.setFeature("http://xml.org/sax/features/namespaces", false);

Смотрите также документацию к пакету http://jdom.org/docs/apidocs/org/jdom2/input/sax/package-summary.html, где говорится:

Note that the existing JDOM implementations described above all set the generated XMLReaders to be namespace-aware and to supply namespace-prefixes. Custom implementations should also ensure that this is set unless you absolutely know what you are doing

Что вы, вероятно, хотите сделать, это просто:

SAXBuilder builder = new SAXBuilder(XMLReaders.NONVALIDATING);

что, как это бывает, так же, как:

SAXBuilder builder = new SAXBuilder();

И, таким образом, ваш код будет:

SAXBuilder builder = new SAXBuilder();

//@see http://www.jdom.org/docs/faq.html#a0350
builder.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false);
builder.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);

org.jdom2.Document doc2 = builder.build(new InputSource(new StringReader(xml)));
Другие вопросы по тегам