从Xml克隆节点并在没有Xml NS验证的情况下使用它

时间:2018-05-29 05:45:33

标签: c# xml xml-parsing xml-namespaces

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

稍后我应该能够从该字符串创建一个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 :(得分:0)

好的,我似乎已经开始工作了。

当我到处搜索时,几乎无论如何都可能。

我终于通过使用一个根本没有查看命名空间的工具来完成工作。

我使用HtmlAgilityPack解析并重新创建xml,它就像一个魅力!

这里的代码是它如何做到的神奇之处!

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

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

        }