如何解决如何 XML 序列化由固定文本和属性值组成的字符串?
在 my previous question 中,我询问了如何将对象通过 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 序列化。
这就是我的类(我实现了 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 *}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。