2016-06-27 11 views
0

私のアプリケーションでxmlファイルを使用する方法を学びたいと思っています。私は要素の単純な読み込みを行い、オプションで要素を書き換えてその値を取得したい。一つだけのアカウント要素と複数のChartName要素があるでしょうxmlで単純な要素を読み書きする

<?xml version="1.0" encoding="utf-16"?> 
<PTH> 
    <Account> 
    <Username>aa</Username> 
    <Password>xx</Password> 
    <Email>[email protected]</Email> 
    <Role>Student</Role> 
    </Account> 
    <ChartName> 
    <Id>1</Id> 
    <Name>John Smith</Name> 
    <PlaceOfBirth>louisville, ky</PlaceOfBirth> 
    <BirthDate>1/1/70</BirthDate> 
    <TimeZone>Greenwich</TimeZone> 
    </ChartName> 
    <ChartName> 
    <Id>2</Id> 
    <Name>John Smith</Name> 
    <PlaceOfBirth>New York, NY</PlaceOfBirth> 
    <BirthDate>1/1/1980</BirthDate> 
    <TimeZone>Greenwich</TimeZone> 
    </ChartName> 
    <ChartName> 
    <Id>3</Id> 
    <Name>Jane Doe</Name> 
    <PlaceOfBirth>Los Angeles, Ca</PlaceOfBirth> 
    <BirthDate>1/1/1990</BirthDate> 
    <TimeZone>Greenwich</TimeZone> 
    </ChartName> 
</PTH> 

:私はのようになりますxmlファイルを持っています。

public class Account 
{ 
    public string Username { get; set; } 
    public string Password { get; set; } 
    public string Email { get; set; } 
    public string Role { get; set; } 
} 

... 

    XDocument xml = XDocument.Load(HttpContext.Current.Server.MapPath("~") + "\\App_Data\\" + username.Text.Trim()); 
    XElement xEle = xml.Element("PTH"); 

    var Accounts = (from Account in xml.Root.Elements("Account") 
        select new 
        { 
         Email = (string)Account.Element("Email").Value, 
         Role = (string)Account.Element("Role").Value 
        }); 
    foreach (var Account in Accounts) 
    { 
     Session["Email"] = Account.Email; 
     Session["Role"] = Account.Role; 
    } 

コードは動作しますが、単に要素の値を読み取るには本当に、本当に複雑な方法のようだ:私が思いついたコードです。また、私は、電子メールの要素の値だけをどのように書き換えることができるのかよく分かりません。誰かが要素値を読み書きする方法がありますか?非常に基本的なはずですが、それは私を逃げ出します...

+0

「アカウント」ノードが1つだけの場合、なぜ「foreach」とLinq?私はXPathを使用して単一のノードを選択して値(InnerText)を得ることができると思います。 [参考](https://msdn.microsoft.com/en-us/library/h0hw012b(v = vs.110).aspx) – zgood

+0

ええ、「foreach」は過剰殺人のようですが、それは私が私が読んでいたチュートリアル。ほとんどのチュートリアルでは、単純なxmlファイルが表示されます。たとえば、「book」のような主要な要素の1つのタイプのみで、複数の要素タイプを持つファイルはありません。 – SteveFerg

+0

あなたはXML形式を制御できますか? の要素が親のにラップされている場合は、シリアル化可能です。 – Derpy

答えて

1

私はこのサンプルを書きました。これはたった6行で、XML文書の読み取りと書き込みを行います。

何が起こっているのかを説明するコメントがあります。

 // this loads up your XDocument. your XDocument is an object which represents your xml file. 
     XDocument xml = XDocument.Load(HttpContext.Current.Server.MapPath("~") + "\\App_Data\\" + username.Text.Trim()); 

     // this is a quick and dirty way to get the all of the elements element named "Email" 
     // don't worry too much about "var" it's still strongly typed, and is just a syntatical shortcut so I dont' have to actually type out 
     // the name of whatever type xml.Descendant returns. 
     var emails = xml.Descendants("Email"); 

     // if you want just one, use "First" 
     var firstEmail = emails.First(); 

     // if you want the value, use the ".Value" property 
     Console.WriteLine(firstEmail.Value); 

     // if you want to change it, use normal assignment, and 
     firstEmail.Value = "[email protected]"; 

     // if you want to persist your changes to disk, save your document. 
     xml.Save("C:\\temp\\otherfolder\\xmldocument.xml"); 

あなたも、より多くの短縮形をしたい場合は、あなたがXPath syntaxを使用する方法についてThis answerを見ることができます(答えはあなたがXMLを管理している場合は、あなたが今使用して名前空間がusing System.Xml.XPath;

1

であることを、少し時代遅れですJSONは実際には私の選択肢のフォーマットですが、XMLも機能します。後でプリファレンス・プロパティーを追加する場合は、PTHクラスに追加するだけです。

private void Test() 
    { 
     var obj = new PTH() 
     { 
      Account = new Account() { UserName = "bob's", Password = "burgers" }, 
      ChartNames = Enumerable.Range(1, 3).Select(x => new ChartName() { Id = x, name = "Name_" + x.ToString() }).ToArray() 
     }; 
     var xml = SerializeXML(obj); 
     var objDeserialized = DeserializeXML<PTH>(xml); 
     var chartsToChange = objDeserialized.ChartNames.Where(x => x.Id == 1).ToList(); 
     foreach (var chart in chartsToChange) 
     { 
      chart.name = "new name"; 
     } 

     var backToXML = SerializeXML(objDeserialized); 
    } 

    public static string SerializeXML<T>(T obj) 
    { 
     var izer = new System.Xml.Serialization.XmlSerializer(typeof(T)); 

     using (var stringWriter = new StringWriter()) 
     { 
      using (var xmlWriter = new XmlTextWriter(stringWriter)) 
      { 
       izer.Serialize(xmlWriter, obj); 
       return stringWriter.ToString(); 
      } 
     } 
    } 

    public static T DeserializeXML<T>(string xml) 
    { 
     var izer = new System.Xml.Serialization.XmlSerializer(typeof(T)); 

     using (var stringReader = new StringReader(xml)) 
     { 
      using (var xmlReader = new XmlTextReader(stringReader)) 
      { 
       return (T)izer.Deserialize(xmlReader); 
      } 
     } 
    } 
    public class PTH 
    { 
     public Account Account { get; set; } 
     public ChartName[] ChartNames { get; set; } 
    } 
    public class Account 
    { 
     public string UserName { get; set; } 
     public string Password { get; set; } 
    } 

    public class ChartName 
    { 
     public int Id { get; set; } 
     public string name { get; set; } 
    } 

XMLはそれほど違いはありません。つまり、配列項目には親ノードが必要です。

<?xml version="1.0" encoding="UTF-8"?> 
<PTH xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <Account> 
     <UserName>bob's</UserName> 
     <Password>burgers</Password> 
    </Account> 
    <ChartNames> 
     <ChartName> 
     <Id>1</Id> 
     <name>Name_1</name> 
     </ChartName> 
     <ChartName> 
     <Id>2</Id> 
     <name>Name_2</name> 
     </ChartName> 
     <ChartName> 
     <Id>3</Id> 
     <name>Name_3</name> 
     </ChartName> 
    </ChartNames> 
</PTH> 
+0

これは私にそれを見る別の方法を与える。私が占星術の図表を見るのを始めるとき、ほとんどの読書/執筆はチャートの名前にあるでしょう。私は、処理に必要なユーティリティ関数を書いているので、このソリューションは非常に役に立ちます。ありがとうございました。 – SteveFerg

関連する問題