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>