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



我正在尝试从 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);

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

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

我终于设法通过使用一个根本不查看命名空间的工具使 t 工作。

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

这里的代码是它如何做到这一点的魔力!

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

最新更新