从 Xml 克隆一个节点并在没有 Xml NS 验证的情况下在其他地方使用它

Clone a Node from Xml and Use it somewhere Else without Xml NS Validation

我正在尝试从 Xml 文件加载结构,以便我可以在其他地方重建它。 大多数部分已经解析并加载到对象中。但是有些部分是无用的并且没有改变,所以我决定将这些节点放在它们的层次结构中并将节点及其后代保留为字符串。

稍后我应该能够从该字符串制作一个 XmlElement 或 XmlFragment 并将其重新附加到我正在制作的 xml 文件。

目前加载部分没问题。我可以复制所选部分并将其保存为 Xml 节点。但是为了重新附加它,我必须将它转换为 xmlElement,这就是 CustomXmlNamespaces 破坏一切的地方。命名空间加载在完整的 xml 文档中,但是当我获取文件片段时,它显然不包含命名空间。

当我想加载片段字符串时,它提示我

System.Xml.XmlException: ''mxswa' is an undeclared prefix. Line 1, position 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);

好的,我似乎让它工作了。

因为我到处搜索,几乎任何可能的搜索。

我终于设法通过使用根本不查看名称空间的工具使它工作。

我使用 HtmlAgilityPack 来解析和重新创建 xml,它非常有效!

这里的代码是它的神奇之处!

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

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

        }