c# - XML 序列化注释

标签 c# xml serialization xml-serialization xelement

我遇到过这样的情况:我不想修改一个 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/

相关文章:

c# DataContractSerializer 继承

c# - 尽管我实现了 GetObjectData 方法和构造函数,但反序列化不起作用

c# - 在MySQL表中插入 "\\"时出现问题

c# - 如何在C#中将Badgerfish样式的JSON转换为.NET对象或XML?

c# - 如何处理 OdbcException

c# - 我可以在返回值时执行代码吗?

java - 通过原始套接字编码字符串 - 额外字符

c# - DataContractSerializer 和通用列表

c# - WCF + EF6 防止引用程序集中的枚举被序列化

c# - StreamingContextStates.Clone 到底做了什么?