gpt4 book ai didi

c# - XML 序列化注解

转载 作者:行者123 更新时间:2023-11-30 22:50:09 25 4
gpt4 key购买 nike

我有一个不想修改的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com