Добавлен фрагмент XHTML в документ XML и проведена проверка по схеме - PullRequest
2 голосов
/ 09 апреля 2009

По сути, я хочу встроить некоторый XHTML в документ XML, который должен проверяться на соответствие пользовательской схеме.

Полный фон:

У меня есть веб-сервис, который использует документ XML. Этот документ XML проверяется на соответствие пользовательской схеме. Данные в формате XML анализируются и сохраняются в базе данных, а также отображаются в удобном формате на веб-сайте.

У клиента, который запускает XML на моем веб-сервисе, есть собственный внутренний "парень по программированию и программированию". Он хочет иметь возможность отображать некоторые пользовательские XHMTL в некоторых заполнителях на некоторых страниц веб-сайтов.

Мы согласились, что он может расширить XML, который он запускает в моем веб-сервисе, чтобы включить 3 новых элемента, которые будут содержать HTML, и я соответствующим образом скорректирую свою схему. Я также сделаю обработку, чтобы вывести его XHTML из документа XML на веб-страницы.

Я не хочу использовать cdata, поскольку это может быть небезопасно (я думаю!), Поэтому я пытался использовать <xs:any> в схеме:

<xs:element name="SomeXhtmlStuff" minOccurs="0">
  <xs:complexType>
    <xs:sequence>
      <xs:any minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

Я думал, что это будет означать, что любой допустимый XML будет в порядке в элементе, например все теги XHTML будут в порядке, однако я попробовал это:

<SomeXhtmlStuff>
  <p>This is a test HTML output for Job Details</p>
</SomeXhtmlStuff>

и XML не будет проверять его. Редактировать: Visual Studio 2008 в нем автоматический валидатор выдает ошибку "элемент 'p' не объявлен"

У меня нет большого опыта работы с XML / схемой, и я унаследовал этот проект, любые предложения будут приветствоваться!

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

Ответы [ 4 ]

0 голосов
/ 09 апреля 2009

Возможно, вам следует рассмотреть возможность помещения пространства имен xhtml в этот элемент xs: any. Вы также можете изменить атрибут processContents на «lax». Значение атрибута lax сообщает валидатору, что он должен проверить контент, если может найти определение. Итак, лучшая модель элемента может быть:

<xs:element name="SomeXhtmlStuff" minOccurs="0" >
    <xs:complexType>
    <xs:complexContent mixed="true">
      <xs:restriction base="xs:anyType">
        <xs:sequence>
          <xs:any processContents="lax"
                  namespace="http://www.w3.org/1999/xhtml"
                  minOccurs="0"
                  maxOccurs="unbounded"/>
        </xs:sequence>
      </xs:restriction>
    </xs:complexContent>
  </xs:complexType>
  </xs:element>

Конечно, вы также можете изменить этот смешанный тип контента, если он просто вставляет elements в ваш XML.

0 голосов
/ 09 апреля 2009

Какую ошибку вы получили?

Я считаю, что <xs:any/> означает «любой XML, который будет проверять». Что будет проверять <p/>?

0 голосов
/ 09 апреля 2009

После еще одного поиска, я нашел этот фрагмент схемы, который, кажется, работает:

<xs:element name="SomeXhtmlStuff" minOccurs="0" >
    <xs:complexType>
    <xs:complexContent mixed="true">
      <xs:restriction base="xs:anyType">
        <xs:sequence>
          <xs:any processContents="skip"
                  minOccurs="0"
                  maxOccurs="unbounded"/>
        </xs:sequence>
      </xs:restriction>
    </xs:complexContent>
  </xs:complexType>
  </xs:element>
0 голосов
/ 09 апреля 2009

Я считаю, что лучше использовать раздел CDATA. В мире (X) HTML существуют документы с неверной разметкой. Несмотря на это, браузеры на самом деле отображают полезные вещи. Таким образом, проблема в том, что вы, вероятно, не будете время от времени получать ответы, потому что другой конец пытался отправить недопустимый XHTML внутри XML-документа и перестал работать правильно.

Кстати, издатели Atom и RSS используют разделы CDATA для вставки разметки XHTML / HTML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...