В настоящее время я работаю над графическим редактором XML, для которого важно, чтобы я мог получить доступ к отдельным элементам через их атрибут ID.Я создал схему XML, в которой я определяю атрибут ID.Я использую javax.xml.parsers.DocumentBuilderFactory и назначаю ему схему через соответствующий SchemaFactory.Проверка моего XML-документа также работает, я получаю сообщения об ошибках, если не соблюдаются ограничения.Однако Attr.isId () всегда возвращает false.
Подсказкой может быть следующее сообщение об ошибке: Ошибка: URI = null Строка = 2: корневой элемент документа "TABS" должен соответствовать корневому элементу DOCTYPE "null".Для меня это звучит так, будто парсер пытается проверить XML-документ, используя DTD вместо схемы.Я использую Java 1.8.
Парсинг документа и загрузка схемы
public static Document generateDom(IDocument xmlDocument) {
String editorText = xmlDocument.get();
StringReader reader = new StringReader(editorText);
InputSource inputSource = new InputSource(reader);
DocumentBuilderFactory documentFactory = DocumentBuilderFactory.newInstance();
setSchema(documentFactory);
documentFactory.setValidating(true);
Document document = null;
try {
DocumentBuilder builder = documentFactory.newDocumentBuilder();
document = builder.parse(inputSource);
} catch (ParserConfigurationException | SAXException | IOException e) {
// TODO ErrorHandling
e.printStackTrace();
}
return document;
}
private static void setSchema(DocumentBuilderFactory documentFactory) {
URL url = DomLoader.class.getResource("..\\..\\..\\resources\\scriptGenerator.xsd");
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = null;
try {
schema = schemaFactory.newSchema(url);
} catch (SAXException e1) {
// TODO ErrorHandling
e1.printStackTrace();
}
documentFactory.setSchema(schema);
}
Выдержка из определения схемы
<xs:element name="GROUP">
<xs:complexType>
<xs:sequence>
<xs:sequence>
<xs:element ref="SQL" />
</xs:sequence>
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:choice>
<xs:element ref="TEXT" />
<xs:element ref="BUTTON" />
<xs:element ref="ALWAYS" />
</xs:choice>
</xs:sequence>
</xs:sequence>
<xs:attribute name="id" use="required" type="xs:ID" />
<xs:attribute name="name" use="required" type="xs:string" />
</xs:complexType>
</xs:element>
Мой .xml файл
<?xml version="1.0" encoding="UTF-8"?>
<TABS>
<TAB id="ID_ea1270bc-2554-4291-b5ad-8c7802b5fc49" name="Tab 1">
<GROUP id="ID_3155171c-d2ac-4717-aa38-009005c79e18" name="Group 1">
<SQL>
<PREPARE>
<CONSTANT/>
</PREPARE>
<MERGE>
<CONSTANT/>
</MERGE>
<SYNCHRONIZE>
<CONSTANT/>
</SYNCHRONIZE>
</SQL>
</GROUP>
</TAB>
</TABS>
Мой вывод на консоль, если используется Attr.isId ():
id | false
name | false
id | false
name | false
id | false
name | false
type | false