1

複数のXMLテンプレートがあり、LINQ to XMLを使用してそれらを入力したいのですが、開始方法、つまりXMLファイルを正しく読み取り(最良の方法)、属性とノードを入力する方法(InnerText)がわかりませんでした。また、既存のテンプレートに新しい要素と属性を作成し、既存のものを削除/更新するにはどうすればよいですか?テンプレートの例を次に示します。

<Person age="age">
<FirstName></FirstName>
<LastName></LastName>
<Children>
<Name></Name>
</Children>
</Person>

abvoeでは、age属性はプレースホルダーであり、FirstName、LastName、およびChildrenの下のNameはプレースホルダーです。また、子の下の名前を削除するか、名前も追加したいとします。また、Person内に日、月、年の属性を持つDOB要素を追加したいとしますか?

4

3 に答える 3

1

これが例です。テンプレートごとにクラスを作成します。私はこのライブラリ拡張クラス (XElementExtensions.cs) を使用しています: https://github.com/ChuckSavage/XmlLib/

public class Person
{
    XElement self;
    public Person(XElement person) { self = person; }

    // Age should be a value of Now minus DOB in years.
    public int Age { get { return DateTime.Now.Year - DOB.Year; } }

    public DateTime DOB
    {
        get { return self.Get("DOB", DateTime.MinValue ); } // choose a default date that works for you
        set { self.Set("DOB", value, true); } // true set as attribute
    }

    public string FirstName
    {
        get { return self.Get("FirstName", string.Empty); }
        set { self.Set("FirstName", value, false); } // false set as child node
    } 

    public string LastName
    {
        get { return self.Get("LastName", string.Empty); }
        set { self.Set("LastName", value, false); }
    } 

    public Children Children
    {
        get { return new Children(self.GetElement("Children")); }
    }
}

public class Children
{
    XElement self;
    public Children(XElement children) { self = children; }

    public Child this[string name]
    {
        get 
        { 
            return self.Elements("Name")
                         .Select(x => new Child(x))
                         .FirstOrDefault(c => c.Name == name);
        }
    }

    public Child this[int index]
    {
         get { return new Child(self.Elements("Name").ElementAt(index)); }
    }

    public void Add(string name)
    {
         Child child = this[name];
         if(null == child)
         {
             child = new Child(new XElement("Name"));
             child.Name = name;
             self.Add(child.self);
         }
         else
             throw new ArgumentException("Child with name: "+ name +" already exists!");
    }
}

public class Child
{
    internal XElement self;
    public Child(XElement child) { self = child; }

    // You can have an Age/DOB for the child as well, or remove these two properties.
    // Age should be a value of Now minus DOB in years.
    public int Age { get { return DateTime.Now.Year - DOB.Year; } }

    // DOB is an attribute as self.Value in Name erases all child nodes when set.
    public DateTime DOB
    {
        get { return self.Get("DOB", DateTime.MinValue ); } // choose a default date that works for you
        set { self.Set("DOB", value, true); }
    }

    public string Name
    {
        get { return self.Value }
        set { self.Value = value; }
    } 
}

Get() のデフォルトとして null を指定する場合は、Get の型を指定する必要があります。Get<Type>("node", null)

于 2012-05-29T16:04:11.443 に答える
0

LINQ to XMLとその XDocument クラスを確認することをお勧めします。これにより、xml ドキュメントのナビゲーションと編集が非常に簡単になります。

于 2012-05-29T14:50:17.663 に答える
-1

linq to xml のサンプルについては、このサイトを参照してください。

于 2012-05-29T14:50:57.737 に答える