Фильтровать элементы XML типа anyURI с использованием XSD - PullRequest
3 голосов
/ 20 сентября 2019

Я использую go-libxml2 .У меня есть XSD, а также XML.Я хочу отфильтровать все элементы anyURI в XML на основе XSD, включая вложенные элементы.Потому что я пытаюсь обновить все элементы anyURI в XML, добавив параметр запроса.Например,

XSD:

    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="grandParent">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="AnyURI1" type="xs:anyURI" 
         maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  <xs:element name="parent">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="AnyURI2" type="xs:anyURI" 
           maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
    <xs:element name="children">
      <xs:complexType>
        <xs:sequence>
          <xs:element name="AnyURI3" type="xs:anyURI" 
             maxOccurs="unbounded"/>
        </xs:sequence>
      </xs:complexType>
    </xs:element>
  </xs:element>
</xs:element>
</xs:schema>

XML

    <grandParent>
  <AnyURI1>    http://uri_gp1.com </AnyURI1>
  <AnyURI1>    http://uri_gp2.com </AnyURI1>
  <parent>
    <AnyURI2>    http://uri_p1.com    </AnyURI2>
    <AnyURI2>    http://uri_p2.com    </AnyURI2>
    <children>
      <AnyURI3>    http://uri_child1.com    </AnyURI3>
      <AnyURI3>    http://uri_child2.com    </AnyURI3>
    </children>
  </parent>
</grandParent>

В приведенном выше XML-файле я хочу отфильтровать и обновить все элементы типа "anyURI", например * 1011.*

Как мне добиться этого с помощью golang?

Ответы [ 2 ]

3 голосов
/ 20 сентября 2019

Я думаю, вы должны рассмотреть альтернативные варианты технологии для этого.Проблема становится очень простой благодаря преобразованию XSLT с учетом схемы:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0"
               xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xsl:mode on-no-match="shallow-copy">
  <xsl:template match="element(*, xs:anyURI)/text()">
    <xsl:value-of select=". || '?param=value'"/>
  </xsl:template>
</xsl:transform>
0 голосов
/ 27 сентября 2019

Для полнофункциональных процессоров XML, поддерживающих XML-схему, информационный набор Post Schema Validation (PSVI) предоставит вам именно то, что вы хотите.Пример PSVI показывает, как получить к нему доступ с помощью Xerces C.

Из того, что я вижу, проблема с go-libxml2 заключается в том, что сама libxml2 не смогла реализовать PSVI.Дизайнеры учли «будущее» расширение PSVI, которое, я думаю, никогда не материализовалось.(Взгляните на libxml2 doc и найдите PSVI.) Из-за этого ответ таков: вы не можете достичь того, чего хотите.

Если вы готовы интегрироваться с другимиплатформы, Java Xerces будет работать в том смысле, что вы можете делегировать задачу ему.

...