У меня есть файл 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")