0

以下は私のXMLファイルです。

<Employee>
    <FirstName>#{FirstName}#</FirstName>
    <LastName>#{LastName}#</LastName>
    <DOB>#{DOB}#</DOB>
    <Address>#{Address}#</Address>
    <Transcation>
        <Month>#{Month}#</Month>
        <Amount>#{Amount}#</Amount>
    </Transcation>
    <Transcation>
        <Month>#{Month}#</Month>
        <Amount>#{Amount}#</Amount>
    </Transcation>
    <Transcation>
        <Month>#{Month}#</Month>
        <Amount>#{Amount}#</Amount>
    </Transcation>
    <Transcation>
        <Month>#{Month}#</Month>
        <Amount>#{Amount}#</Amount>
    </Transcation>

そして私のシリアル化可能なクラスは

[XmlRoot("Employee"), Serializable]    
 public class Employee    
 {    
     [XmlAnyElement]
      public List<XmlElement> EmployeeDetails    { get; set; }
 }

しかし、私はこのようなものを手に入れたい

EmployeeDetailsでは、FirstName、LastName、DOB、Address、....のみをシリアル化する必要があります。また、シリアル化可能な要素としてMonthとAmountを含む別のクラスでTranscationのリストを取得する必要があります。

このようなもの

[XmlRoot("Employee"), Serializable]    
public class Employee    
{    
 [XmlAnyElement]
 public List<XmlElement> EmployeeDetails    { get; set; }

 [XmlElement("Transcation")]
 public List<Transcation> Transcations { get; set; }

}

public class Transcation
{
  [XmlElement("Month")]
    public string Month{ get; set; }
  [XmlElement("Amount")]
    public string Amount{ get; set; }

}

これどうやってするの ?

4

2 に答える 2

1

XMLを変更できないとすると、クラスは次のようになります。XmlAnyElementは使用できますが、おそらくオブジェクト配列として設定する必要があります。したがって、コードは次のようになります。

[XmlRoot("Employee"), Serializable]
public class Employee
{
    [XmlAnyElement]
    public XmlElement [] EmployeeDetails { get; set; }

    [XmlElement("Transcation")]
    public List<Transaction> Transcations { get; set; }
}

デシリアライズするには、次のようにします。

    private void DeserializeObject(string filename)
    {
        XmlAnyElementAttribute myAnyElement = new XmlAnyElementAttribute();
        XmlAttributeOverrides xOverride = new XmlAttributeOverrides();
        XmlAttributes xAtts = new XmlAttributes();
        xAtts.XmlAnyElements.Add(myAnyElement);
        xOverride.Add(typeof(Employee), "EmployeeDetails", xAtts);

        XmlSerializer ser = new XmlSerializer(typeof(Employee), xOverride);

        FileStream fs = new FileStream(filename, FileMode.Open);
        var g = (Employee)ser.Deserialize(fs);
        fs.Close();

        Console.WriteLine(g.EmployeeDetails.Length);
        foreach (XmlElement xelement in g.EmployeeDetails)
        {
            Console.WriteLine(xelement.Name + ": " + xelement.InnerXml);
        }
    }

代わりにプロパティを指定することをお勧めします。特定の値を簡単に検索できるようになります。ただし、これは、事前にxmlスキーマについて知っていることによって異なります。

[XmlRoot(ElementName="Employee")]    
public class Employee    
{    
  [XmlElement(ElementName="FirstName")]    
  public string FirstName {get;set;}

  [XmlElement(ElementName="LastName")]
  public string LastName {get;set;}

  [XmlElement(ElementName="DOB")]
  public DateTime DOB {get;set;}

  [XmlElement(ElementName="Address")]
  public string Address {get;set;}

  [XmlElement(ElementName="Transaction")]
  public List<Transaction> Transaction {get;set;}
}


[XmlRoot(ElementName="Transaction")]
public class Transaction
{

  [XmlElement(ElementName="Month")]
  public int Month {get;set;}

  [XmlElement(ElementName="Amount")]
  public int Amount {get;set;}
}
于 2012-11-21T13:54:29.470 に答える
0

XMLの外観を完全に制御したい場合は、独自のXMLDocumentを作成し、ノード/要素を手動で追加できます。より多くの作業が必要ですが、XMLがどのように見えるかを正確に微調整することができます。

于 2012-11-21T13:54:21.997 に答える