1

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

前任:

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

有没有办法做到这一点?

4

1 回答 1

2

据我所知,使属性名称动态化的唯一方法是考虑任何属性。创建 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));

抱歉,答案很长,希望它能解决您的要求... :)

于 2013-08-12T16:32:51.127 回答