我正在使用 xsd.exe 生成一个 C# 类,该类将用于将数据序列化为 XML。但是,我对标签的属性之一是动态的。
前任:
<foo cat="onething">
or
<foo dog="something">
有没有办法做到这一点?
据我所知,使属性名称动态化的唯一方法是考虑任何属性。创建 XML Schema 后,在 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));
抱歉,答案很长,希望它能解决您的要求... :)