При использовании основной сборки взаимодействия Office и вызове CustomXMLNode.AppendChildNode (), как я могу ссылаться на ранее определенное пространство имен XML? - PullRequest
1 голос
/ 23 сентября 2019

Очевидно, что я что-то упускаю, потому что я не могу ссылаться на ранее определенное пространство имен XML при вызове CustomXMLNode.AppendChildNode() в Office 2016 или более поздней версии:

private void AppendChild(Microsoft.Office.Core.CustomXMLNode node)
{
    node.AppendChildNode("nil", "xmlns:xsi", Microsoft.Office.Core.MsoCustomXMLNodeType.msoCustomXMLNodeAttribute, "true");
}

Приведенный выше вызов вызывает:

<IndexId xmlns:ns3="xmlns:xsi" ns3:nil="true"></IndexId>

Что не понимается службой, на которую я отправляю сообщения.CustomXMLPart знает о пространстве имен "xsi", что очевидно из открывающего тега строки, возвращаемой CustomXMLPart.XML:

<ns1:TestData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns1="http://schemas.rockportsys.com/rockportXML">

Так что, очевидно, аргумент "NamespaceURI" (см. https://docs.microsoft.com/en-us/dotnet/api/microsoft.office.core.customxmlnode.appendchildnode) просто воспринимается буквально и каждый раз определяется как новое пространство имен.Я пробовал все следующее безрезультатно:

node.AppendChildNode("nil", "xsi",       Microsoft.Office.Core.MsoCustomXMLNodeType.msoCustomXMLNodeAttribute, "true");
node.AppendChildNode("nil", "xsi:",      Microsoft.Office.Core.MsoCustomXMLNodeType.msoCustomXMLNodeAttribute, "true");
node.AppendChildNode("nil", ":xsi",      Microsoft.Office.Core.MsoCustomXMLNodeType.msoCustomXMLNodeAttribute, "true");
node.AppendChildNode("nil", "xmlns:xsi", Microsoft.Office.Core.MsoCustomXMLNodeType.msoCustomXMLNodeAttribute, "true");

Все вышеперечисленные вызовы производят эквивалент следующего с <NamespaceURI_arg>заменяется строкой, переданной в качестве второго аргумента выше:

<IndexId xmlns:ns3="<NamespaceURI_arg>" ns3:nil="true"></IndexId>

Ничего из этого не работает с потребляющим сервисом. Как, черт возьми, мы должны ссылаться на ранее определенное пространство имен при добавлении дочернего элемента?такое волшебное заклинание?

Единственный способ, которым я смог заставить его работать, - это:

node.AppendChildNode("nil", "http://www.w3.org/2001/XMLSchema-instance", Microsoft.Office.Core.MsoCustomXMLNodeType.msoCustomXMLNodeAttribute, "true");

, который приводит к ненужному многословию:

<IndexId xmlns:ns0="http://www.w3.org/2001/XMLSchema-instance" ns0:nil="true"></IndexId>
...