流式传输列表很简单,并且可以完全控制 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 中的流结果?
欢迎任何建议。
这个“问题”提供了一个很好的概述,并且(据我看来)无法回答。该问题没有解决方案(除了实现 IXmlSerialisable 之外。)
我认为这是“关闭”。