Проверка значений XML через XSD с помощью регулярных выражений - PullRequest
0 голосов
/ 11 апреля 2019

В настоящее время у меня есть XML в следующем формате:

<?xml version="1.0"?>
<trace_data>
  <pinfo>1</pinfo>
  <traces>
    <P0>21:39:09.776762 clock_gettime(CLOCK_BOOTTIME, {68, 27131557}) = 0
</P0>
    <P1>21:39:09.776831 epoll_ctl(4, EPOLL_CTL_DEL, 60, NULL) = 0
</P1>
    <P2>21:39:09.776856 close(60)               = 0
</P2>
  </traces>
</trace_data>

Где элементы процесса (P0, P1 и т. Д.) Должны образовывать последовательность до n процессов (P0 ... Pn)

Я сейчас пытаюсь создать XSD для проверки этих XML. Еще одна важная особенность должна заключаться в том, что значения каждого из процессов должны начинаться со времени (например, 21: 39: 09.123123).

Я придумал следующий XSD, но не могу понять, как проверить значения элементов процесса.

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="https://www.w3schools.com"
xmlns="https://www.w3schools.com"
elementFormDefault="qualified">


<xs:element name="trace_data">
  <xs:complexType>
    <xs:element name = "pinfo" type="xs:string"/>
    <xs:element name = "traces" type="Process"/>
  </xs:complexType>
</xs:element>


<!-- <THIS DESCRIBES P0 to Pn FOR WINDOWSIZE n> -->
<xs:complexType name="Process">
        <xs:sequence>
            <xs:any minOccurs="1" maxOccurs="unbounded" processContents="lax"/>
        </xs:sequence>
    <xs:assert test=" "
</xs:complexType> 
<!-- <PROCESS ENDS HERE> -->


</xs:schema> 

Может ли кто-нибудь помочь мне или указать мне правильное направление?

Заранее спасибо.

1 Ответ

1 голос
/ 11 апреля 2019

Кто бы ни разрабатывал этот формат XML, он не думал о том, что хорошо работает в XSD или, в этом отношении, с любыми другими инструментами XML. Такое использование структурированных имен элементов кажется разумной идеей, но на самом деле это очень неприятно.

Один из подходов состоит в том, чтобы выполнить проверку как двухэтапный процесс: сначала преобразовать XML в нечто более обычное (и более простое в обработке):

<traces>
    <P nr="0" time="21:39:09.776762">clock_gettime(CLOCK_BOOTTIME, {68, 27131557}) = 0</P>
    <P nr="1" time="21:39:09.776831">epoll_ctl(4, EPOLL_CTL_DEL, 60, NULL) = 0</P>
...
</traces>

и затем примените XSD к результату, который теперь намного проще.

Хотя вам все еще потребуются утверждения XSD 1.1, чтобы подтвердить, что числа образуют правильную последовательность:

<xsd:assert test="not(P[position() != @nr + 1])"/>
...