C# XML 流和在特定情况下失去对节点名称的控制

问题描述 投票:0回答:1

流式传输列表很简单,并且可以完全控制 xml 节点名称。 但这种控制在某些情况下不可用。这是三个例子。

情况 A 和 B 是正常工作的(但我不想使用)。 情况 C 也可以工作,但失去了对 xml 节点名称的控制。 (我想使用这个with来控制节点名称)。

注意:C 中的问题可以通过实现

IXmlSerializable
来避免,但这对于看似小问题来说是大量额外的工作。

例如A:

[XmlRoot(ElementName = "root")]
public class MyClass
{
    [XmlArray("my_names_list"), XmlArrayItem(typeof(string), ElementName = "my_name")]
    public List<string> MyNames { get; set; } = new List<string>();
}

将此 xml 作为可能的结果。

<root>
    <my_names_list>
        <my_name>first value</my_name>
        <my_name>second value</my_name>
    </my_names_list>
</root>

或B

[XmlRoot(ElementName = "root")]
public class MyClass
{
    [XmlElement(ElementName = "my_name")]
    public List<string> MyNames { get; set; } = new List<string>();
}

用这个xml

<root>
    <my_name>first value</my_name>
    <my_name>second value</my_name>
</root>

但是在以下情况C中我遇到了问题(关于列表元素节点名称的控制)。如何设置列表元素的节点名称?

[XmlRoot(ElementName = "root")]
public class MyClass : List<string> { }

无论您尝试使用哪个标签,这只会产生以下内容。

<root>
    <string>first value</string>
    <string>second value</string>
</root>

在代码示例 A 和 B 中有一个成员,它是一个列表,这不是我想要使用的。 对于流媒体来说,大多数情况下我更喜欢 A,有时我更喜欢 B。

在代码示例 C 中,列表没有类成员,该类继承自列表,这就是我想要使用的。

在这个例子中,

string
中的
List<string>
并不是什么大问题。但一个
List<MyClassWithTheUglyLongNamy>
更让人恼火,或者我必须在我的编码风格上做出让步,或者我必须接受xml流结果。或者我可以尝试找到一种方法来控制/指导 C# 中的 XML 解析器。 (我知道我可以用
IXmlSerializable
来做到这一点,但是对于一个名称更改来说这是很多额外的工作。)

对于流C,我失去了对列表元素节点名称的控制。无论我尝试改变什么,编译器都不会接受。

如何使用示例 C 中的编码并在不使用

IXmlSerializable
的情况下获取示例 B 中的流结果?

欢迎任何建议。

c# xml
1个回答
0
投票

这个“问题”提供了一个很好的概述,并且(据我看来)无法回答。该问题没有解决方案(除了实现 IXmlSerialisable 之外。)

我认为这是“关闭”。

© www.soinside.com 2019 - 2024. All rights reserved.