在 xsd class 中访问 Xml 元素属性

Accessing Xml Element Attribute in a xsd class

我有一个来自 xsd 的生成的 c# class。当我想给元素赋值时

result res = new result();
res.feed = "123132";

// 这行得通 res.data 在这里我找不到 id 和值,我该怎么做,例如 res.data.id="something"

我有一个 xml :

<result>
    <feed></feed>
    <status></status>
    <data>
        <id></id>
        <value></value> 
        <id></id> 
        <value></value> 
    </data>
</result>

生成这个 xsd :

  <xs:element name="result">
    <xs:complexType>
      <xs:sequence>
        <xs:element type="xs:string" name="feed"/>
        <xs:element type="xs:string" name="status"/>
        <xs:element name="data">
          <xs:complexType>
            <xs:choice maxOccurs="unbounded" minOccurs="0">
              <xs:element type="xs:string" name="id"/>
              <xs:element type="xs:string" name="value"/>
            </xs:choice>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

并且使用 xsd.exe 我已经为它生成了 class

public partial class result {

    private string feedField;

    private string statusField;

    private resultData dataField;

    /// <remarks/>
    public string feed {
        get {
            return this.feedField;
        }
        set {
            this.feedField = value;
        }
    }

    /// <remarks/>
    public string status {
        get {
            return this.statusField;
        }
        set {
            this.statusField = value;
        }
    }

    /// <remarks/>
    public resultData data {
        get {
            return this.dataField;
        }
        set {
            this.dataField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
public partial class resultData {

    private string[] itemsField;

    private ItemsChoiceType[] itemsElementNameField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("id", typeof(string))]
    [System.Xml.Serialization.XmlElementAttribute("value", typeof(string))]
    [System.Xml.Serialization.XmlChoiceIdentifierAttribute("ItemsElementName")]
    public string[] Items {
        get {
            return this.itemsField;
        }
        set {
            this.itemsField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("ItemsElementName")]
    [System.Xml.Serialization.XmlIgnoreAttribute()]
    public ItemsChoiceType[] ItemsElementName {
        get {
            return this.itemsElementNameField;
        }
        set {
            this.itemsElementNameField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(IncludeInSchema=false)]
public enum ItemsChoiceType {

    /// <remarks/>
    id,

    /// <remarks/>
    value,
}

看来您必须执行以下操作

res.data = new resultData();
res.data.ItemsElementName = new [] 
{ 
    ItemsChoiceType.id,
    ItemsChoiceType.value,
    ItemsChoiceType.id,
    ItemsChoiceType.value,
};
res.data.Items = new [] 
{ 
    "id 1",
    "value 1",
    "id 2",
    "value 2",
};

基本上你必须设置每个数组来包含类型和对应的值。当您创建数组时,它们应该具有相同的长度,并且类型和值应该位于相同的位置。

然而,如果你想要 id-value 对,你应该重新考虑你的 XML 的结构,因为目前它只允许你输入 ids 或只是值,并且不保证顺序或者会有每个的数量相同。也许像下面这样的东西更像你想要的。

<result>
    <feed></feed>
    <status></status>
    <data>
        <dataItem>
            <id></id>
            <value></value> 
        </dataItem>
        <dataItem>
            <id></id> 
            <value></value> 
        </dataItem>
    </data>
</result>