Xml 序列化 - 创建对象层次结构以实现预定义的 xml 结构
我需要创建以下 XML,并希望通过 XmlSerialization 创建它,以便数据本身可以通过对象动态生成。
<chart>
<series>
<value xid="0">Not Submitted: 20</value>
<value xid="1">Submitted: 11</value>
<value xid="2">Rejected: 2</value>
</series>
<graphs>
<graph gid="0">
<value xid="0" color="#FF0000">20</value>
<value xid="1" color="#00FF00">11</value>
<value xid="2" color="#0000FF">2</value>
</graph>
<graph gid="1">
<value xid="0" color="#FF0000">24</value>
<value xid="1" color="#00FF00">7</value>
<value xid="2" color="#0000FF">4</value>
</graph>
</graphs>
</chart>
我最初想出了这个,但它并不完全有效(事实上,其中一些完全是错误的)。有什么想法吗?
// the //chart/series/value elements with attributes
internal class BarChartSeriesValue
{
[XmlAttribute(AttributeName = "xid")]
public int Xid { get; set; }
[XmlText]
public int Value { get; set; }
}
// the //chart/graphs/graph/value elements with attributes
internal class BarChartGraphValue
{
[XmlAttribute(AttributeName = "xid")]
public int Xid { get; set; }
[XmlAttribute(AttributeName = "color")]
public string Color { get; set; }
[XmlText]
public int Value { get; set; }
}
// the //chart/series collection of values
internal class BarChartSeries : List<BarChartSeriesValue>
{
[XmlElement(ElementName = "series")]
public List<BarChartSeriesValue> Series { get; set; }
}
// the //chart/graphs/graph collection of values
internal class BarChartGraph : List<BarChartGraphValue>
{
[XmlAttribute(AttributeName = "gid")]
public int GraphId { get; set; }
}
// the //chart/graphs collection of graph elements
internal class BarChartData
{
[XmlElement(ElementName = "series")]
public BarChartSeries Series { get; set; }
[XmlElement(ElementName = "graphs")]
public BarChartGraph Graphs { get; set; }
}
编辑 - 太平洋标准时间 8 月 22 日晚上 11:24
当我说这完全是错误的时,我所要做的就是查看它并意识到数据结构不会映射到所需的 XML。真正让我困惑的部分是嵌套图结构。
我以前不知道如何通过 XSD 从 XML 生成类。它看起来非常有用和有帮助。
感谢所有提供解决方案的人
I need to create the following XML and want to create it via XmlSerialization so the data itself can be generated dynamically via objects.
<chart>
<series>
<value xid="0">Not Submitted: 20</value>
<value xid="1">Submitted: 11</value>
<value xid="2">Rejected: 2</value>
</series>
<graphs>
<graph gid="0">
<value xid="0" color="#FF0000">20</value>
<value xid="1" color="#00FF00">11</value>
<value xid="2" color="#0000FF">2</value>
</graph>
<graph gid="1">
<value xid="0" color="#FF0000">24</value>
<value xid="1" color="#00FF00">7</value>
<value xid="2" color="#0000FF">4</value>
</graph>
</graphs>
</chart>
I originally came up with this but it doesn't completely work (in fact, some of it is just plain wrong). Any ideas?
// the //chart/series/value elements with attributes
internal class BarChartSeriesValue
{
[XmlAttribute(AttributeName = "xid")]
public int Xid { get; set; }
[XmlText]
public int Value { get; set; }
}
// the //chart/graphs/graph/value elements with attributes
internal class BarChartGraphValue
{
[XmlAttribute(AttributeName = "xid")]
public int Xid { get; set; }
[XmlAttribute(AttributeName = "color")]
public string Color { get; set; }
[XmlText]
public int Value { get; set; }
}
// the //chart/series collection of values
internal class BarChartSeries : List<BarChartSeriesValue>
{
[XmlElement(ElementName = "series")]
public List<BarChartSeriesValue> Series { get; set; }
}
// the //chart/graphs/graph collection of values
internal class BarChartGraph : List<BarChartGraphValue>
{
[XmlAttribute(AttributeName = "gid")]
public int GraphId { get; set; }
}
// the //chart/graphs collection of graph elements
internal class BarChartData
{
[XmlElement(ElementName = "series")]
public BarChartSeries Series { get; set; }
[XmlElement(ElementName = "graphs")]
public BarChartGraph Graphs { get; set; }
}
EDIT - 8/22 11:24pm PST
When I said it was just plain wrong, all I had to do was look at it and realize that the data structures wouldn't map to the desired XML. The part that was really throwing me was the nested graphs structure.
I previously did not know about generating classes from XML via the XSD. It looks very useful and helpful.
Thanks to all who provided solutions
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
这是一个快速项目。
我使用这个类或其变体:
C# 的通用 XML 序列化器类和 XML 序列化使用示例
下面是您需要的代码。
以下是如何使用它。
Here is a quick project.
I use this class or a variant of it:
Generic XML Serializer Class for C# and an XML Serialization usage example
Then here is the code you need.
Here is how to use it.
您可以使用 XSD.exe 生成该类,(我认为)它是 Visual Studio 的一部分。
如果您打开 Visual Studio 命令提示符,则可以访问它。
在硬盘上的某个位置创建一个物理 XML 文件。 (我使用了您的 xml 并打包了 example.xml)
打开 Visual Studio 命令提示符
导航到目录
键入 ' xsdsample.xml'(不带引号)这将生成sample.xsd
类型为'xsd Sample.xsd /c'(不带引号)这将生成sample.cs
设置使用 Microsoft Visual Studio 2008 的环境x86 工具。
生成:
还有sample.cs,
有点乱,但是节省了你很多时间和精力。
You can generate the class using XSD.exe which (i think) ships as part of visual studio.
If you open up Visual Studio Command Prompt you can access it.
Create a physical XML file on your harddrive somewhere. (I used your xml and crated sample.xml)
Open up Visual Studio Command Prompt
Navigate to the directory
type 'xsd sample.xml' (without the quotes) this will generate sample.xsd
type in 'xsd sample.xsd /c' (without the quotes) this will generate sample.cs
Setting environment for using Microsoft Visual Studio 2008 x86 tools.
Generates:
And sample.cs
It's a little bit messy but saves you a lot of time and effort.
示例 Xml:
类:
Sample Xml :
Class: