首页 > 解决方案 > 如何 XML 序列化由固定文本和属性值组成的字符串?

问题描述

我之前的问题中,我询问了如何将 XML 序列化为类似的对象:

<PO X=0 Y=0 ... />

我的对象如下所示:

public class Offset
{
    public int X { get; set; }
    public int Y { get; set; }

如评论和答案中所述,这是无效的 XML,因此尝试将 XML 序列化为该对象是没有意义的。

客户同意另一种格式(有效的 XML):

<PO>X=0 Y=0 ...</PO>

但是如何做到这一点?

我看到了三种方法来完成这项工作:

我尝试了第一种方法,但失败了,所以我决定创建一个新属性,这就是我目前拥有的:

[XmlRoot(ElementName = "PO")]
public class Offset
{
    [XmlIgnore]
    public double X { get; set; }
    [XmlIgnore]
    public double Y { get; set; }
    [XmlIgnore]
    public double Z { get; set; }
    [XmlIgnore]
    public double Phi { get; set; }
    [XmlElement(ElementName = "output")]
    public string xml_output;

    public string generate_xml_output()
    { return $"X={X} Y={Y} Z={Z} PHI={Phi}"; }

    public Offset()
    { X = 0; Y = 0; Z = 0; Phi = 0;
      xml_output = generate_xml_output(); }

这是我当前的 XML:

<PO>
  <output>X=0 Y=0 Z=0 PHI=0</output>
</PO>

这是接近但没有雪茄:-)

有谁知道我如何告诉 XML 序列化程序将该output属性用作“默认属性”(以省略<output>标签)?

提前致谢

之后编辑

乍一看,一切似乎都很好,但setter现在出现了问题。我自己编写了一个解析器,但我的印象是,虽然它看起来不错,但缺少一些东西,并且弄乱了我的 XML 序列化。

这就是我的课程(使用我的实现setter)的样子:

        [XmlText]
        public string xml_output
        {
            get { return $"X={X} Y={Y} Z={Z} PHI={Phi}"; }
            set { 
                  string[] temp = xml_output.Split(' ');
                  try 
                  { X = Convert.ToDouble(temp[0].Replace("X=","")); } 
                  catch (Exception) 
                  { X = 0; }
                  try
                  { Y = Convert.ToDouble(temp[1].Replace("Y=", "")); }
                  catch (Exception)
                  { Y = 0; }
                  try
                  { Z = Convert.ToDouble(temp[2].Replace("Z=", "")); }
                  catch (Exception)
                  { Z = 0; }
                  try
                  { Phi = Convert.ToDouble(temp[3].Replace("PHI=", "")); }
                  catch (Exception)
                  { Phi = 0; }
                }
        }

你知道我setter缺少什么吗?

标签: c#xmlxml-serialization

解决方案


[XmlText]
public string CompositeOutput {
    get { return $"X={X} Y={Y} Z={Z} PHI={Phi}"; }
    set { /* your parse logic here *}
}

推荐阅读