Я пытаюсь сохранить некоторые данные в файле Excel, используя компонент CustomXMLParts. Я тоже плохо себя чувствую.
У меня есть следующий код:
Public Shared Sub AddSettingsXMLToDocument()
Dim xmlPart As XElement =
<SoftwareName xmlns="myNamespace">
<Settings>
<FormVersion></FormVersion>
<FormPassword>"Password"</FormPassword>
<DatabaseRequiresAdminMode></DatabaseRequiresAdminMode>
</Settings>
</SoftwareName>
Dim aWorkbook As Excel.Workbook = Globals.ThisAddIn.Application.ActiveWorkbook
aWorkbook.CustomXMLParts.Add(xmlPart.ToString(), System.Type.Missing)
End Sub
Public Shared Function GetSettingsXMLFromDocument() As String
Dim aWorkbook As Excel.Workbook = Globals.ThisAddIn.Application.ActiveWorkbook
'GET THE ENTIRE THING
Dim retrievedXMLParts As Office.CustomXMLParts = aWorkbook.CustomXMLParts.SelectByNamespace("myNamespace")
Dim customXMLPart As Office.CustomXMLPart = retrievedXMLParts2.Cast(Of Office.CustomXMLPart)().FirstOrDefault()
'TRYING TO GET A SPECIFIC FIELD
Dim formField As Office.CustomXMLNode = customXMLPart2.SelectSingleNode("XpathExpression")
If (Not IsNothing(formField)) Then _
MsgBox("FINALLY GOT MY NODE! " & vbNewLine & d1.XML)
If (IsNothing(formField)) Then _
MsgBox("ARG")
Return FormField.XML
End Function
Линейка, которая меня интересует: Dim formField As Office.CustomXMLNode = customXMLPart2.SelectSingleNode("XpathExpression")
Я довольно пробовал КАЖДУЮ вещь как выражение Xpath, и я получил нулевое значение для всего, кроме "*/".
Я также прочитал статью об пространствах имен, но он не будет работать с VSTO, поскольку Office.CustomXMLParts не позволит вам перегружать функцию параметром NamespaceManager. SelectSingleNode возвращает значение null для известного пути xml-узла с использованием XPath
Как я могу создать свои данные из Office.CustomXMLParts? Как обновить Workbook.CustomXMLParts?
Большое спасибо!
Редактировать: Я уезжаю на несколько дней. Я ценю ваш вклад много! К сожалению, я не смогу подтвердить какое-либо решение до моего возвращения.
Если вы действительно не можете найти способ зарегистрировать префикс пространства имен и использовать его в своем XPath, вы можете прибегнуть к игнорированию пространства имен и фильтрации узлов по его локальному имени. Например (форматируется для удобства чтения):
//*[local-name()='SoftwareName']
/*[local-name()='Settings']
/*[local-name()='FormPassword']