如何XML序列化一个由固定文本和属性值组成的字符串?
How to XML serialise a string, composed of fixed text and attribute values?
在 中,我询问了如何 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>
但是如何做到这一点?
我看到了完成此任务的三种方法:
- 使用 XML 序列化程序指令,如
[XmlRoot]
、[XmlElement]
、[XmlAttribute]
和其他指令来控制 XML 序列化程序。
- 创建一个新属性并将该属性用于 XML 序列化。
- 两者的结合。
我尝试了第一种方法但失败了,所以我决定创建一个新属性,这是我目前拥有的:
[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 序列化。
这就是我的 class(使用 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
丢了什么吗?
[XmlText]
public string CompositeOutput {
get { return $"X={X} Y={Y} Z={Z} PHI={Phi}"; }
set { /* your parse logic here *}
}
在
<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>
但是如何做到这一点?
我看到了完成此任务的三种方法:
- 使用 XML 序列化程序指令,如
[XmlRoot]
、[XmlElement]
、[XmlAttribute]
和其他指令来控制 XML 序列化程序。 - 创建一个新属性并将该属性用于 XML 序列化。
- 两者的结合。
我尝试了第一种方法但失败了,所以我决定创建一个新属性,这是我目前拥有的:
[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 序列化。
这就是我的 class(使用 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
丢了什么吗?
[XmlText]
public string CompositeOutput {
get { return $"X={X} Y={Y} Z={Z} PHI={Phi}"; }
set { /* your parse logic here *}
}