XmlNode InnerXml против OuterXml

Я столкнулся со странной ситуацией, и я надеюсь, что кто-то, кто понимает лучше меня, может помочь мне решить ее.

Я вставляю изображение в документ XML так, чтобы его можно было открыть с помощью Microsoft Word. Как часть этого, мне нужно добавить Xml "Relationship", который отображается на элемент, содержащий изображение. Достаточно просто.

Я добавляю узел, который должен выглядеть следующим образом:

<Relationship Id="rId6" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="media/image1.png"  />

Тем не менее, в конечном файле.doc, эта же строка выглядит так:

<Relationship Id="rId6" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="media/image1.png" xmlns="" />

то есть теперь он имеет пустой атрибут xmlns="".

Это достаточно для Word, чтобы поверить, что документ поврежден и отказывается открывать. Если я вручную открою файл и удалю этот атрибут, файл откроется.

Понятно, что я хочу удалить это программно:-) Итак, я нашел родительский узел. Здесь мое понимание немного смутно. Я полагал, что элемент OuterXml содержит узел и содержимое всех его дочерних элементов, тогда как InnerXml просто содержит дочерние элементы.

Вот что я вижу (обратите внимание, что escape-символы - это то, что я вырезал из средства просмотра текста в Visual Studio).

OuterXml:

"<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">
<Relationship Id=\"rId3\"     Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/webSettings\" Target=\"webSettings.xml\" />
 <Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings\" Target=\"settings.xml\" />
<Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\" Target=\"styles.xml\" />
<Relationship Id=\"rId5\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme\" Target=\"theme/theme1.xml\" />
<Relationship Id=\"rId4\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable\" Target=\"fontTable.xml\" />
<Relationship Id=\"rId6\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\" Target=\"media/image1.png\" xmlns=\"\" />

</Relationships>"

InnerXml:

"<Relationship Id=\"rId3\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/webSettings\" Target=\"webSettings.xml\" xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\" />
<Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings\" Target=\"settings.xml\" xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\" />
<Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\" Target=\"styles.xml\" xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\" />
<Relationship Id=\"rId5\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme\" Target=\"theme/theme1.xml\" xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\" />
<Relationship Id=\"rId4\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable\" Target=\"fontTable.xml\" xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\" />
<Relationship Id=\"rId6\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\" Target=\"media/image1.png\" />"

Обратите внимание, что 6-й и последний элемент имеет ошибочный xmlns="" в OuterXml, но не в InnerXml. Я могу легко изменить InnerXml, но не OuterXml.

Итак, мой последний вопрос: "Как мне избавиться от этого добавленного атрибута?", Но я также надеюсь, что кто-то может объяснить, почему существует разница между Xml внутреннего и внешнего (кроме контейнера).

1 ответ

Решение

Как вы добавляете узел в ваш документ? Похоже, это происходит потому, что этот элемент не имеет пространства имен (в отличие от других элементов, которые имеют пространство имен " http://schemas.openxmlformats.org/package/2006/relationships"). Имейте в виду, что пространства имен не похожи на "нормальные" атрибуты и необходимы для "идентичности" тега.

В примере "OuterXml" все первые 5 узлов Relationship имеют то же пространство имен, что и родительский элемент, поэтому его не нужно явно определять. 6-й узел не имеет пространства имен, поэтому xmlns = ""

В примере "InnerXml" все первые 5 узлов имеют одно и то же пространство имен, но не имеют родительских элементов для наследования, каждый из них определяет его явно. 6-й узел все еще имеет пустое пространство имен.

В итоге: документ не поврежден из-за строки 'xmlns="", он поврежден, поскольку элемент Relationship должен иметь пространство имен " http://schemas.openxmlformats.org/package/2006/relationships".

Чтобы лучше проиллюстрировать, вот пример XML-документа.

<root xmlns="urn:foo:bar" xmlns:ns1="urn:baz">
    <item />
    <ns1:item />
    <item xmlns="" />
</root>
  • Пространство имен корневого элемента: "urn:foo:bar"
  • Пространство имен 1-го элемента item "urn:foo:bar"
  • Пространство имен второго элемента item - "urn:baz"
  • Пространство имен 3-го элемента item - ""

Если бы вы получили "внутренний xml" корневого тега, он мог бы выглядеть примерно так:

<item xmlns="urn:foo:bar" />
<item xmlns="urn:baz" />
<item xmlns="" />

Как упомянуто выше, пространство имен является неотъемлемой частью "идентичности" тега, или как вы хотите его называть. Следующие документы все функционально идентичны:

<foo:root xmlns:foo="urn:foo" xmlns:bar="urn:bar">
    <foo:element />
    <bar:element />
</foo:root>

<root xmlns="urn:foo" xmlns:bar="urn:bar">
    <element />
    <bar:element />
</root>

<root xmlns="urn:foo">
    <element />
    <element xmlns="urn:bar" />
</root>
Другие вопросы по тегам