我正在使用xsd.exe生成一个C#类,用于将数据序列化为XML。但是,我对标签的一个属性是动态的。
例如:
<foo cat="onething">
or
<foo dog="something">
有没有办法做到这一点?
答案 0 :(得分:2)
据我所知,使属性名称动态化的唯一方法是考虑任何属性。创建XML模式后,在XSD文件中添加 <xs:anyAttribute>
属性,然后生成您的类。
<xs:element maxOccurs="unbounded" name="Project">
<xs:complexType>
<xs:sequence>
<xs:element name="Name" type="xs:string" />
<xs:element name="Mark">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:unsignedByte">
<xs:attribute name="IsLate" type="xs:string" use="optional" />
<xs:attribute name="MadeEarlyDeadline" type="xs:string" use="optional" />
<xs:anyAttribute/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
您的xml对象类将具有`XmlAttribute [] AnyAttr'属性。在反序列化时,XML对象中未定义的任何新属性都将显示在此属性中,但在序列化时,它将显示为新属性。
序列化示例......让我们说这个人在项目中被“欺骗”。
xmlProject project = new xmlProject();
XmlDocument xd = new XmlDocument();
XmlAttribute cheated = xd.CreateAttribute("Cheated");
cheated.Value = "Yes";
XmlAttribute[] xa = new XmlAttribute[]{ cheated };
project.Mark = new xmlProjectMark() { IsLate = "Yes", MadeEarlyDeadline = "False", AnyAttr = xa, Value=70 };
project.Name = "Jonathan";
XmlSerializer writer = new XmlSerializer(typeof(xmlProject));
StreamWriter file = new StreamWriter(@"C:\test.xml");
writer.Serialize(file, project);
file.Close();
上面会给你这样的东西:
<xmlProject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Name>Jonathan</Name>
<Mark IsLate="Yes" MadeEarlyDeadline="False" Cheated="Yes">70</Mark>
</xmlProject>
反序列化:
XmlDocument xd2 = new XmlDocument();
xd2.Load(@"C:\test.xml");
XmlSerializer xs = new XmlSerializer(typeof(xmlProject));
xmlProject deserializedProject = (xmlProject)xs.Deserialize(new XmlNodeReader(xd2.DocumentElement));
对不起,答案很长,希望它能解决你的要求...... :)