Java XML DOM: почему Java XML Attr.isId () возвращает false, когда должно возвращать true - PullRequest
0 голосов
/ 29 октября 2018

У меня есть файл xsd с таким разделом:

<xsd:complexType name="tDefinitions">
    <xsd:attribute name="id" type="xsd:ID" use="optional"/>

Я создаю DocumentBuilder следующим образом:

private final DocumentBuilderFactory _docBldF = DocumentBuilderFactory.newInstance();

....

public synchronized void addSchema(String schemaUri) {
    if(!_schemaUris.contains(schemaUri)){
        _schemaUris.add(schemaUri);
    }
    Source[] allSources = new Source[_schemaUris.size()];
    for (int i = 0; i < allSources.length; i++) {
        allSources[i] = new StreamSource(_schemaUris.get(i));
    }

    Schema schema;
    SchemaFactory scFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
    try {
        schema = scFactory.newSchema(allSources);
    } catch (SAXException e) {
        throw new RuntimeException(e);
    }

    _docBldF.setSchema(schema);
    _docBldF.setNamespaceAware(true);
}

....

exec.addSchema(getClass().getResource("model/xsd/some.xsd").toURI().toString());

и вот как я загружаю XML:

        DocumentBuilder dBuilder = _docBldF.newDocumentBuilder();
        Document document = dBuilder.parse(xml);
        document.normalizeDocument();

тогда я хожу по этому документу:

    definitionsElement = document.getDocumentElement();
    NodeList defNodes = definitionsElement.getChildNodes();
    .....

А теперь я хочу узнать идентификатор элемента:

    NamedNodeMap attrs = element.getAttributes();
    String id = null;
    for (int i = 0; i < attrs.getLength(); i++) {
        Attr attr = (Attr) attrs.item(i);
        if (attr.isId()) {
            id = attr.getValue();
            break;
        }
    }

isId() возвращает false, даже если в отладчике я вижу:

attr.getSchemaTypeInfo().getTypeName().equals("ID") // true

и другие следы, что схема была фактически загружена.

Пожалуйста, сообщите, что мне не хватает, так как я думаю, что делаю все, что должен, в правильном порядке: загрузка XSD, настройка распознавания пространства имен, нормализация документа.

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

addSchema теперь вызывается только один раз, но он предназначен для многократного вызова с различными XSD-файлами и считается способным адаптировать DocumentBuilder для загрузки XML-файлов любого формата (схемы), который мы добавили бы. Я ожидал бы, что это повредит Doc Builder при вызове во второй раз, но теперь он вызывается только один раз ...

UPD Просто для удовольствия:

_document.getElementById("some_id").getAttributeNode("id").isId() // return false

Анализатор может найти элемент по его идентификатору, но не может сказать, что атрибут id является идентификатором. На своем уровне знаний я считаю это невозможным, пожалуйста, помогите

В качестве обходного пути я собираюсь проверить

attr.getSchemaTypeInfo().getTypeName().equals("ID")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...