LINUX.ORG.RU

Включить в XML текст из текстового файла

 , , ,


0

1

Вот возникла такая задача:

Есть в описании структуры XML вот такой нод:

DTD
[br]<!ELEMENT ReportNote (#PCDATA)*>[br]

Или XSD
[br]<xs:element name="ReportNote" type="xs:string" />[br]

Хочется ну такого... странного. Чтоб в тегах
[br]<ReportNote>Мама мыла Лушу мылом</ReportNote>[br]
находился не текст их текстового файла, а что-то типа:
[br]<ReportNote>[br] <xi:include xmlns="http://www.w3.org/2001/XInclude" href="note.txt" parse="text"/>[br]</ReportNote>[br]

Написать в XML такое запросто, :) но вот только парсер ругается на то что в теге ReportNote не должно быть вложенных тегов, а должна быть строка.
Честно говоря, не хочется в теги весь текст из файла пихать. Сейчас именно так и сделано. Хочется как-то поэлегантнее.

Кто знает, как в DTD/XSD описать такой include? Я чего-то не нашел. Может и нельзя, а я тут горы пустой породы лопачу.

★★★★★

Последнее исправление: cetjs2 (всего исправлений: 2)

Сделать mixed?

<xs:element name="ReportNote">
  <xs:complexType mixed="true">
    <xs:sequence>
      <xs:element ref="xi:include" minOccurs="0"/>
    </xs:choice>
  </xs:complexType>
</xs:element> 

А еще парсеры могут сами автоматически делать XInclude, только надо их попросить об этом. Тогда не надо свою схему уродовать ссылками на XInclude. Например, libxml2:

CLI:
man xmllint
       --xinclude
              Do XInclude processing.

API:

Function: xmlXIncludeProcess

int xmlXIncludeProcess (xmlDocPtr doc)

Implement the XInclude substitution on the XML document @doc

doc: an XML document
Returns: 0 if no substitution were done, -1 if some processing failed or the number of substitutions done.

fopen ★★
()
Ответ на: комментарий от fopen

В схему сунул

<xs:element name="ReportNote"> <xs:complexType mixed="true"> <xs:sequence> <xs:element ref="xi:include" minOccurs="0" xmlns:xi="http://www.w3.org/2003/XInclude"/> </xs:sequence> </xs:complexType> </xs:element>

Ругается. Говорит что «Пространство имен http://www.w3.org/2003/XIncludeх не доступно для ссылок в этой схеме». Перенос в заголовочную часть тоже самое. Без ссылки на Xincludex еще больше не нравится. Говорит что ref не любит xi:include

Попробую с DTD что-то сделать...

vada ★★★★★
() автор топика
Последнее исправление: vada (всего исправлений: 1)
Ответ на: комментарий от Hater

В DTD написал вот такое:


<!ENTITY ReportNote SYSTEM «ReportNote.txt»>

получил сообщение что элемент ReportNote не определен.

Что-то не получается. Может забить на все это. Работает и ладно...
Но больно некрасиво :(

vada ★★★★★
() автор топика
Ответ на: комментарий от fopen

К сожалению, проект под офтопик, и либу мелкософтовскую.
Моя бы воля... :(

vada ★★★★★
() автор топика
Ответ на: комментарий от Hater

До подстановки дело не дошло. DTD с ошибкой.
Я вот думаю, а может отключить эти всяческие DTD/XSD :) может тогда проканает :)

vada ★★★★★
() автор топика
Ответ на: комментарий от vada

Тоже не прокатило :(

В XML написал


<ReportNote xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include href=«ReportNote.txt» parse=«text»>
<xi:fallback>Файл 'ReportNote.txt' не найден.</xi:fallback>
</xi:include>
</ReportNote>


В HTML получил

<pre>
Файл 'ReportNote.txt' не найден.
</pre>

vada ★★★★★
() автор топика
Ответ на: комментарий от vada

Ура! Получилось!

В схему внес изменения. Получилось вот так:

<?xml version=«1.0» encoding=«utf-8»?>
<xs:schema elementFormDefault=«qualified»
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:xi="http://www.w3.org/2001/XInclude">
  
  <xs:import namespace="http://www.w3.org/2001/XInclude"
     schemaLocation="http://www.w3.org/2001/xinclude.xsd"/>
  
..............

  <xs:complexType name=«ReportNote» mixed=«true»>
    <xs:choice minOccurs=«1» maxOccurs=«unbounded»>
      <xs:element ref=«xi:include»/>
    </xs:choice>
  </xs:complexType>

В XML вот так:

<ReportNote xmlns:xi="http://www.w3.org/2001/XInclude">
      <xi:include href=«d:\KO205W\WORK\Тест-Обь-оп2П-2рр\ReportNote.txt» parse=«text»>
        <xi:fallback>Файл 'ReportNote.txt' не найден.</xi:fallback>
      </xi:include>
</ReportNote>
vada ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.