使用XSD.exe时添加自定义/动态属性

时间:2013-08-12 15:51:04

标签: c# .net xml xsd xsd.exe

我正在使用xsd.exe生成一个C#类,用于将数据序列化为XML。但是,我对标签的一个属性是动态的。

例如:

<foo cat="onething">
or
<foo dog="something">

有没有办法做到这一点?

1 个答案:

答案 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));

对不起,答案很长,希望它能解决你的要求...... :)