2012-03-29 3 views
4

C#でxmlファイルを書きたいと思います。そのため、私はXElementオブジェクトを使いたいが、私はできません条件付きでXMLをあまり控え目に書くことはできますか?

<EmployeeConfiguration> 
    <Bosses> 
    <Boss name="BOB"> 
     <Employees> 
     <Employee Id="#0001" /> 
     <Employee Id="#0002" /> 
     </Employees> 
    <Boss> 
    </Bosses> 
</EmployeeConfiguration> 

と私はEmployeeノードが存在しない場合はEmployeesノードを持っていたくない...

:それはそのような基本的なファイルです...だから私はXmlWriterを使用しました。それが正常に動作しますが、私はそれがXMLを書くために非常に冗長です見つける:

EmployeeConfiguration config = EmployeeConfiguration.GetConfiguration(); 

using (XmlWriter writer = XmlWriter.Create(_fileUri, settings)) 
{ 
    writer.WriteStartDocument(); 

    // <EmployeeConfiguration> 
    writer.WriteStartElement("EmployeeConfiguration"); 

    if (config.Bosses.Count > 0) 
    { 
    // <Bosses> 
    writer.WriteStartElement("Bosses"); 

    foreach (Boss b in config.Bosses) 
    { 
     // Boss 
     writer.WriteStartElement("Boss"); 
     writer.WriteStartAttribute("name"); 
     writer.WriteString(b.Name); 
     writer.WriteEndAttribute(); 

     if (b.Employees.Count > 0) 
     { 
     writer.WriteStartElement("Employees"); 

     foreach (Employee emp in b.Employees) 
     { 
      writer.WriteStartElement(Employee); 
      writer.WriteStartAttribute(Id); 
      writer.WriteString(emp.Id); 
      writer.WriteEndAttribute(); 
      writer.WriteEndElement(); 
     } 
     } 
    } 
    } 
} 

は、XMLファイルのこの種を書き込むための別の(そして最速の)方法はありますか?

+0

これはかなり効率的です。 –

+1

ええ、実行時には効率的ですが、書きません:( – Florian

答えて

6

あなたがそれを行うにはいくつかのコード(最も単純な)を書くための最速の方法として、「最速」を意味場合は、カスタムクラスを作成し、XmlSerializerを使用して、それをシリアル化すると移動するための方法です...

次のようにクラスを作成します。

[XmlRoot("EmployeeConfiguration")] 
public class EmployeeConfiguration 
{ 
    [XmlArray("Bosses")] 
    [XmlArrayItem("Boss")] 
    public List<Boss> Bosses { get; set; } 
} 

public class Boss 
{ 
    [XmlAttribute("name")] 
    public string Name { get; set; } 

    [XmlArray("Employees")] 
    [XmlArrayItem("Employee")] 
    public List<Employee> Employees { get; set; } 
} 

public class Employee 
{ 
    [XmlAttribute] 
    public string Id { get; set; } 
} 

をしてから、あなたはこれでこれらをシリアライズすることができます:あなたが見ることができるように

// create a serializer for the root type above 
var serializer = new XmlSerializer(typeof (EmployeeConfiguration)); 

// by default, the serializer will write out the "xsi" and "xsd" namespaces to any output. 
// you don't want these, so this will inhibit it. 
var namespaces = new XmlSerializerNamespaces(new [] { new XmlQualifiedName("", "") }); 

// serialize to stream or writer 
serializer.Serialize(outputStreamOrWriter, config, namespaces); 

- クラス上のさまざまな属性を使用してクラスをシリアライズする方法をシリアライザに指示します。上記に含まれているものの中には、実際にはデフォルト設定であり、明示的に述べる必要はありませんが、その仕組みを示すためにそれらを含めています。

+0

モーニング・ロブ!秒でビートしてください。 –

1

XmlElement、XmlAttribute(など)属性を使用して、XMLシリアル化を調べることができます。私は、これがあなたにあなたが望むコントロールのレベル、そしてXML変換を行うための非常に速く、安全で、簡単に保守する呼び出しを与えると思います。

1
var xml = new XElement("EmployeeConfiguration", 
         new XElement("Bosses"),       
         new XElement("Boss", new XAttribute("name", "BOB"), 
          new XElement("Employees"), 
          new XElement("Employee", new XAttribute("Id", "#0001")), 
          new XElement("Employee", new XAttribute("Id", "#0001")) 
        ) 
       ); 
+0

XElementを使用している場合、ロジックを指定できません。 – Florian

+0

閉じるが、コレクションも簡単に処理できます。 。[OK]を、私は見しかし、それは議論の余地からだ - @Florian –

+0

@Florian(config.Bosses.Count> 0){ // writer.WriteStartElementは( "ボス")場合には、ロジックのどのような –

関連する問題