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