Проверка RelaxNG с использованием xmlint

Я пытаюсь сделать xmlint для проверки этой схемы. К сожалению, я пришел к какой-то странной проблеме. Похоже, что xmllint интерпретирует неправильные аргументы необязательные без включенного тега interleave. Вот некоторая тестовая схема с тегом person с ошибкой, который должен сигнализироваться xmllint. К сожалению, xmlint сообщает о какой-то другой несуществующей ошибке. Пожалуйста, посмотрите, может быть, я делаю что-то не так:

<?xml version="1.0" encoding="ISO-8859-1"?>
<grammar xmlns="http://relaxng.org/ns/structure/1.0">

<define name="testproject">
    <element name="testproject">
        <ref name="overview"/>
        <ref name="tests"/>
    </element>
</define>

<define name="overview">
    <element name="overview">
        <ref name="title"/>
        <oneOrMore>
            <ref name="person"/>
        </oneOrMore>
    </element>
</define>

<define name="tests">
    <element name="tests">

        <choice>
            <attribute name="file"/>

            <group>
                <ref name="title"/>
                <optional>
                    <ref name="field"/>
                </optional>
                <optional>
                    <ref name="field2"/>
                </optional>
                <optional>
                    <ref name="field3"/>
                </optional>

                <choice>
                    <zeroOrMore>
                        <ref name="test"/>
                    </zeroOrMore>
                    <zeroOrMore>
                        <ref name="tests"/>
                    </zeroOrMore>
                </choice>
            </group>
        </choice>
    </element>
</define>

<define name="test">
    <element name="test">
        <attribute name="name"/>

        <interleave>
            <optional>
                <ref name="title"/>
            </optional>
            <ref name="field"/>
            <zeroOrMore>
                <ref name="person"/>
            </zeroOrMore>
        </interleave>
    </element>
</define>

<define name="title">
    <element name="title">
        <text/>
    </element>
</define>

<define name="field">
    <element name="field">
        <text/>
    </element>
</define>

<define name="field2">
    <element name="field2">
        <text/>
    </element>
</define>

<define name="field3">
    <element name="field3">
        <text/>
    </element>
</define>

<define name="person">
    <element name="person">
        <text/>
    </element>
</define>

<start>
    <ref name="testproject"/>
</start>
</grammar>

И содержимое файла xml:

<?xml version="1.0" encoding="ISO-8859-1"?>

<testproject>
<overview>
    <title>
        some title
    </title>
    <person>J33nn</person>
</overview>

<tests>
    <title>
        Some title test
    </title>
    <field>as</field> 
    <test name="TestName">
        <title>Some title</title>

        <field>
            dasdasd
        </field>

        <peron>J33nn</peron>
    </test>
</tests>
</testproject>

И вместо того, чтобы сообщить об ошибке в теге peron, он сообщает что-то вроде этого:

поле элемента: ошибка проверки Relax-NG: тесты элементов содержат дополнительное содержимое: поле


person J33nn    schedule 25.02.2014    source источник


Ответы (1)


Когда я запускаю xmllint в вашем файле XML с вашей схемой, я получаю ту же ошибку, о которой вы сообщаете. Однако обратите внимание, что ошибка сообщается для <field>as</field>, что не имеет никакого смысла, поскольку этот элемент должен быть допустимым в этой позиции.

Если я использую jing для выполнения проверки, я получаю:

test.xml:23:16: error: element "peron" not allowed anywhere; expected the element end-tag or element "person"

что является более разумным результатом. Я уверен, что jing прав, а xmllint нет.

person Louis    schedule 25.02.2014
comment
Истинный jing работает хорошо, но хотелось заставить работать xmlint :/ - person J33nn; 26.02.2014
comment
Чтобы xmllint заработал, вам нужно получить исходный код и отладить его, или заплатить кому-то за его отладку, или заставить разработчиков xmllint позаботиться об обнаруженной вами проблеме и отладить ее. - person Louis; 26.02.2014
comment
Из того, что было сообщено, по крайней мере одному стороннему наблюдателю кажется, что xmlint работает нормально. Схема актуальна? нет. xmlint говорит, что это недействительно? да. Ваша проблема в том, что диагностика xmllint плохая и ее сообщение об ошибке бесполезно, а не в том, что он дает неправильный результат. Ни одна система не всегда выдает хорошие сообщения об ошибках. - person C. M. Sperberg-McQueen; 06.03.2014
comment
@ C.M.Sperberg-McQueen xmllint неверен, конец истории. - person Louis; 06.03.2014