Как я могу «включить» один XML-файл в другой XML-файл? - PullRequest
5 голосов
/ 04 декабря 2010

У меня есть такая XML-схема:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="MySchema"
    targetNamespace="http://tempuri.org/MySchema.xsd"
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/MySchema.xsd"
    xmlns:mstns="http://tempuri.org/MySchema.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="MyDocument">
    <xs:complexType>
      <xs:all>
        <xs:element name="TextHeader" type="xs:string" minOccurs="0" />
        <xs:element name="TextBody" type="xs:string" minOccurs="0" />
      </xs:all>
    </xs:complexType>
  </xs:element>
</xs:schema>

Допустимый XML-документ в соответствии с этой схемой будет:

<?xml version="1.0" encoding="utf-8" ?>
<MyDocument xmlns="http://tempuri.org/MySchema.xsd">
  <TextHeader>My header which is almost always the same...</TextHeader>
  <TextBody>My text body which is always different...</TextBody>
</MyDocument>

Вопрос 1: Есть ли способ"включить" элемент TextHeader из другого файла?

Примерно так:

Файл "Header.xml":

<?xml version="1.0" encoding="utf-8" ?>
<MyDocument xmlns="http://tempuri.org/MySchema.xsd">
  <TextHeader>My Header which is almost always the same...</TextHeader>
</MyDocument>

Файл "CompleteDocument.xml":

<?xml version="1.0" encoding="utf-8" ?>
<MyDocument xmlns="http://tempuri.org/MySchema.xsd">

  include "Header.xml" ???

  <TextBody>My text body which is always different...</TextBody>
</MyDocument>

Вопрос 2: Если это вообще возможно, сможет ли .NET XMLSerializer проанализировать и понять документ, содержащий такое «include ...»?

Заранее спасибо за помощь!

Ответы [ 3 ]

3 голосов
/ 04 декабря 2010

Нет на оба вопроса.Вы могли бы что-то кодировать (например, как app.config позволяет импортировать разделы или как xslt обрабатывает включение / импорт), но это не встроено в какую-либо спецификацию XML и не будет соответствовать существующей схеме.Вам, в принципе, придется делать все самостоятельно.

Если вы действительно хотите пойти по этому пути, написать собственный XmlReader, который распознает определенный элемент (в определенном xmlns), и беззвучно объединить в этот момент - возможно,будь лучшим выбором.

0 голосов
/ 07 июля 2013

Ответ на первый вопрос - Да.Вы можете сделать xInclude, чтобы получить содержимое, включенное в основной файл (http://www.w3.org/TR/xinclude/)

0 голосов
/ 04 декабря 2010

Если вы можете изменить свою схему, вы можете использовать XML-сущности .

...