Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XML-(反)将整数的列表属性序列化为一个简单的分隔符分隔的序列_C#_Xml - Fatal编程技术网

C# 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

我正在操作一个包含表单元素的(外部给定的)XML文件

<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" />