Префиксы Linq to Xml и Namespace - PullRequest
       18

Префиксы Linq to Xml и Namespace

4 голосов
/ 17 ноября 2009

Я работаю с Linq to Xml для работы с документами openXml. Точнее я пытаюсь читать и писать в документы пользовательские свойства. В настоящее время у меня проблема с добавлением префикса в XElement. Мой код выглядит так:

Dim main as XNameSpace = "http://schemas.openxmlformats.org/officeDocument/2006/custom-properties"

Dim vt as XNameSpace = "http://schemas.openxmlformats.org/officeDocument2006/docPropsVTypes"

Dim props as XElement = cXDoc.Element(main + "Properties"
        props.Add(New XElement(main + "property"), _
                               New XAttribute("fmtid", formatId), _
                               New XAttribute("pid", pid + 1), _
                               New XAttribute("name", "test"), _
                                    New XElement(vt + "lpwstr", "test value")) _
                 )

Xml, содержащийся в подпорках перед добавлением:

<Properties xmlns="http://schemas.openxmlformats.org/officeDocument/2006/custom-properties" xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes" />

Xml после вызова метода props.add ():

   <Properties xmlns="http://schemas.openxmlformats.org/officeDocument/2006/custom-properties" xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes">
  <property fmtid="{D5CDD505-2E9C-101B-9397-08002B2CF9AE}" pid="2" name="test">
    <lpwstr xmlns="http://schemas.openxmlformats.org/officeDocument2006/docPropsVTypes">test value</lpwstr>
  </property>
</Properties>

В элементе свойства я должен получить

<vt:lpwstr>test value</vt:lpwstr> 

но просто не могу этого добиться. Я не хочу атрибут xmlns для этого элемента здесь. Я думаю, что мне как-то нужно вернуть карту vt XNameSpace обратно в объявление пространства имен в корневом элементе «Свойства». У кого-нибудь есть предложения?

Ответы [ 2 ]

2 голосов
/ 05 февраля 2010

В каком-то месте XElement вам понадобится определенный префикс. Вот как это сделать, поместив vt xmlns вверху, добавив его как XAttribute: New XAttribute(XNamespace.Xmlns + "vt", "http://schemas.openxmlformats.org/officeDocument2006/docPropsVTypes")

Dim main As XNamespace = "http://schemas.openxmlformats.org/officeDocument/2006/custom-properties"
Dim vt As XNamespace = "http://schemas.openxmlformats.org/officeDocument2006/docPropsVTypes"
Dim formatId = "{D5CDD505-2E9C-101B-9397-08002B2CF9AE}"
Dim pid = "2"
Dim props As New XElement(main + "Properties", New XAttribute(XNamespace.Xmlns + "vt", "http://schemas.openxmlformats.org/officeDocument2006/docPropsVTypes"))
props.Add(New XElement(main + "property"), _
                       New XAttribute("fmtid", formatId), _
                       New XAttribute("pid", pid + 1), _
                       New XAttribute("name", "test"), _
                            New XElement(vt + "lpwstr", "test value"))

XML-литералы и глобальные пространства имен могут быть проще, но вам все равно нужно будет указать vt в XML на родительском уровне. Вот пример XML Literals (не забудьте поместить оба оператора Imports вверху класса / модуля, выше всего остального):

Imports <xmlns="http://schemas.openxmlformats.org/officeDocument/2006/custom-properties">
Imports <xmlns:vt="http://schemas.openxmlformats.org/officeDocument2006/docPropsVTypes">
    Sub GetXml()
        Dim formatId = "{D5CDD505-2E9C-101B-9397-08002B2CF9AE}"
        Dim pid = "2"
        Dim props2 = <Properties>
                         <property fmtid=<%= formatId %> pid=<%= pid + 1 %> name="test">
                             <vt:lpwstr>test value</vt:lpwstr>
                         </property>
                     </Properties>
        MsgBox(props2.ToString)
    End Sub
1 голос
/ 18 ноября 2009

Я нашел способ контролировать, где объявляются пространства имен, - использовать литералы Xml. Я также должен воссоздать документ с нуля и скопировать любую существующую информацию из старого документа в мой недавно созданный документ, который не идеален. В приведенном выше примере также есть ошибка, которой достаточно, чтобы любой из офисных документов был поврежден после выполнения кода.

Dim vt as XNameSpace = "http://schemas.openxmlformats.org/officeDocument2006/docPropsVTypes"

Должен читать

Dim vt as XNameSpace = "http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...