Клонировать узел из Xml и использовать его где-нибудь еще без проверки Xml NS - PullRequest
0 голосов
/ 29 мая 2018

Я пытаюсь загрузить структуры из XML-файла, чтобы я мог восстановить его где-нибудь еще.Большинство частей уже проанализированы и загружены в объекты.Но некоторые части бесполезны и не меняются, поэтому я решил взять эти узлы в их Иерархии, взять Узел и его потомков и оставить их в виде строки.

Позже я смогу создать XmlElement или XmlFragment из этой строки и снова присоединить его к создаваемому мной xml-файлу.

Пока что с загрузочной частью все в порядке.Я могу скопировать выбранную часть и держать его как XmlNode.Но для повторного подключения я должен преобразовать его в элемент xmlElement, и именно здесь CustomXmlNamespaces все разрушает.Пространства имен загружаются в полный XML-документ, но когда я беру фрагмент файла, он, очевидно, не содержит пространств имен.

Когда я хочу загрузить строку фрагмента, он запрашивает у меня

System.Xml.XmlException: '' mxswa 'является необъявленным префиксом.Строка 1, позиция 2. '

Итак, строка xml выглядит так:

<mxswa:Workflow.Variables>
  <Variable x:TypeArguments="scg:Dictionary(x:String, mcw:InteractionActivityResult)" Default="[New Dictionary(Of System.String, Microsoft.Crm.Workflow.InteractionActivityResult)]" Name="InteractionResponses" />
  <Variable x:TypeArguments="scg:Dictionary(x:String, mxs:EntityCollection)" Default="[New Dictionary(Of System.String, Microsoft.Xrm.Sdk.EntityCollection)]" Name="QueryResults" />
</mxswa:Workflow.Variables>

И код загрузки такой:

XmlDocumentFragment fragment = doc.CreateDocumentFragment();
fragment.InnerXml = xmlString;
arguments.AppendChild(fragment);

1 Ответ

0 голосов
/ 30 мая 2018

ОК. Кажется, все заработало.

Поскольку я искал везде и почти все возможности.

Мне, наконец, удалось заставить работать, используя инструмент, который не смотрит навообще пространство имен.

Я использую HtmlAgilityPack для разбора и воссоздания xml, и это сработало как чудо!

Код здесь - магия того, как он это делает!

Arguments = xmlNode.Descendants().FirstOrDefault();
            if(Arguments != null)
        {
            HtmlNode arguments = doc.CreateElement(XamlNodeType.GetXamlElementName() + ".Arguments");

            arguments.AppendChild(XmlFragment);
            el.AppendChild(arguments);

        }
...