C# XML-(反)将整数的列表属性序列化为一个简单的分隔符分隔的序列
我正在操作一个包含表单元素的(外部给定的)XML文件C# XML-(反)将整数的列表属性序列化为一个简单的分隔符分隔的序列,c#,xml,C#,Xml,我正在操作一个包含表单元素的(外部给定的)XML文件 <SomeElement SomeAttribute1 = "10" SomeAttribute2 = "Bla"> 10 20 30 40 50 60 70 80 </SomeElement> 是否有?最简单的选择可能是序列化为文本,然后手动解析值。您可以这样做: [Serializable, XmlRoot("SomeElement")] public class Foo { [XmlAt
<SomeElement SomeAttribute1 = "10" SomeAttribute2 = "Bla">
10 20 30 40
50 60 70 80
</SomeElement>
是否有?最简单的选择可能是序列化为文本,然后手动解析值。您可以这样做:
[Serializable, XmlRoot("SomeElement")]
public class Foo
{
[XmlAttribute]
public int SomeAttribute1 { get; set; }
[XmlAttribute]
public int SomeAttribute2 { get; set; }
[XmlText]
public string Raw { get; set; }
[XmlIgnore]
public List<int> Values => Raw
.Split(new [] {" ", "\n"}, StringSplitOptions.RemoveEmptyEntries)
.Select(int.Parse)
.ToList();
}
[Serializable,XmlRoot(“SomeElement”)]
公开课Foo
{
[XmlAttribute]
公共int SomeAttribute1{get;set;}
[XmlAttribute]
公共int SomeAttribute2{get;set;}
[XmlText]
公共字符串原始{get;set;}
[XmlIgnore]
公共列表值=>Raw
.Split(新[]{“”“\n”},StringSplitOptions.RemoveEmptyEntries)
.Select(int.Parse)
.ToList();
}
您可以使用类而不是XmlSerializer
来自动保存压缩集合
您还必须使用而不是列表
请注意,尽管int属性没有标记为xmldattribute
,但它们仍然存储为xml属性
var foo = new Foo
{
SomeAttribute1 = 1,
SomeAttribute2 = 2,
Values = new Int32Collection(new int[] { 1, 2, 3 })
};
Console.WriteLine(XamlServices.Save(foo));
结果:
<Foo SomeAttribute1="1" SomeAttribute2="2" Values="1 2 3" xmlns="clr-namespace:ConApp1;assembly=ConApp1" />
你期望(反)序列化程序能够弥补糟糕的XML设计,这是没有根据的。@kjhughes:别怪我,我只是想利用我现有的。。。所以我可以把你的话理解为“不”的同义词吗?顺便问一下:为什么它是糟糕的XML设计?那么,在XAML中设置WPF按钮的文本也将是糟糕的设计……为什么您认为XmlSerializer
能够处理这种任意格式?当然,姚必须自己做这件事。显然,使用String.Split()
并不难,是吗?这是一种糟糕的XML设计,因为它包含的数据的组成部分不是元素或属性,因此需要微解析。期望在设计糟糕的XML中避免微解析数据是不合理的。谢谢David。如果有第二种意见出现,我会再等一会儿再接受。哇,真有意思。但我想知道这是否真的是普通XML用户想要使用的。如果不是的话,我就改用它,我会不会在一些其他常见的XML特性上陷入死胡同?@oliver-它是WPF的一部分。这样,您就可以连接到此平台。在死胡同中,若你们想打开.NETCore等等,你们会得到。我怀疑这会有多大帮助,因为“我在操作一个(外部给定的)XML文件”。您的xml与OPs的完全不同。
var foo = new Foo
{
SomeAttribute1 = 1,
SomeAttribute2 = 2,
Values = new Int32Collection(new int[] { 1, 2, 3 })
};
Console.WriteLine(XamlServices.Save(foo));
<Foo SomeAttribute1="1" SomeAttribute2="2" Values="1 2 3" xmlns="clr-namespace:ConApp1;assembly=ConApp1" />