我遇到过这样的情况:我不想修改一个 xml 文件。 XElement 类中的 AddAnnotation 函数提供了一个选项来添加仅内存数据,该数据未序列化且不是 XML 的一部分。
我希望能够保存这些注释(例如:保存到另一个 xml 文件),然后反序列化 xml 和注释以获得与我相同的对象。
我不想更改原始 xml,这就是我使用注释的原因。
总而言之,我希望能够将自定义数据添加到 xml 文件中。当我序列化该数据时,该数据不会成为 xml 的一部分,或者它将成为 xml 的一部分,但我可以轻松检索原始 xml。
您对我如何做这样的事情有什么建议吗?
编辑:我应该使用 xml 处理指令吗?处理指令是否适合这种用途?
最佳答案
在我看来,最简单的方法是使用常规节点,但在不同的 xml 命名空间中 - 即
<foo standardAttrubute="abc" myData:customAttribute="def">
<standardElement>ghi</standardElement >
<myData:customElement>jkl</myData:customElement>
</foo>
(其中 myData
是命名空间 uri 的 xmlns
别名)
在许多情况下,读者仅检查其命名空间(或默认/空白命名空间)中的数据 - 通常会跳过自定义命名空间中的值。
要打包原始 xml,一种简单的方法是通过仅尊重默认/原始命名空间的 xslt 运行它。
XNamespace myData = XNamespace.Get("http://mycustomdata/");
XElement el = new XElement("foo",
new XAttribute(XNamespace.Xmlns + "myData", myData.NamespaceName),
new XAttribute("standardAttribute", "abc"),
new XAttribute(myData + "customAttribute", "def"),
new XElement("standardElement", "ghi"),
new XElement(myData + "customAttribute", "jkl"));
string s = el.ToString();
要从 XElement
中删除此类数据,也许:
static void Strip(XElement el, XNamespace ns) {
List<XElement> remove = new List<XElement>();
foreach (XElement child in el.Elements()) {
if (child.Name.Namespace == ns) {
remove.Add(child);
} else {
Strip(child, ns);
}
}
remove.ForEach(child => child.Remove());
foreach (XAttribute child in
(from a in el.Attributes()
where a.Name.Namespace == ns
select a).ToList()) {
child.Remove();
}
}
关于c# - XML 序列化注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/720400/