Нет рабочего атрибута ID при разборе XML в Java - PullRequest
2 голосов
/ 26 июня 2019

В настоящее время я работаю над графическим редактором 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

Ответы [ 2 ]

0 голосов
/ 27 июня 2019

И я исправил проблему: ошибка лежала в пространстве имен моего файла .xsd.Вот решение:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
    targetNamespace="http://www.w3.org/2001/scriptGenerator"
    xmlns="http://www.w3.org/2001/scriptGenerator">
    <xs:element name="TABS">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="1" maxOccurs="unbounded" ref="TAB" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>

и мне также пришлось исправить пространство имен моего .xml файла

<?xml version="1.0" encoding="UTF-8"?>
<TABS xmlns="http://www.w3.org/2001/scriptGenerator"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.w3.org/2001/scriptGenerator
                      scriptGenerator.xsd">
0 голосов
/ 26 июня 2019

Ну, по крайней мере, я нашел решение для ошибки

Error: URI=null Line=2: Document root element "TABS" must match DOCTYPE root "null"

Если вы используете DocumentFactory.setValidating (true) DocumentBuilder фактически ожидает DTD, а не схему. Таким образом, отключение этой функции также приводит к исчезновению ошибки.

...