2016-08-05 5 views
0

私はxmlファイルを以下のように持っています。そして私はキーを使って私に価値を与える方法を作りたいと思っています。XML - C#シリアライズされたオブジェクトのキーを使用して値を取得するための一般的なメソッド

</cbn:Class> 
     <cbt:Students> 
      <cbt:Student> 
      <cbt:Key>x-param-key-studentName-1</cbt:Key> 
      <cbt:Value>x-param-studentSurname-val</cbt:Value> 
      </cbt:Student> 
      <cbt:Student> 
      <cbt:Key>x-param-key-studentName-2</cbt:Key> 
      <cbt:Value>x-param- studentSurname-val</cbt:Value> 
      </cbt:Student> 
     </cbt:Students> 
    </cbn:Class> 

だから、私はstudentNameキーとして使用してstudentSurnameのvaludを取得したいです。 xmlがシリアライズされているので、例えばStudentとしてStudentにアクセスできます。 私は以下のように書かれているコードを使用して、最初の生徒の値を取得することができます:

myDataがシリアライズされたオブジェクトである
string studentSurname = myData.Class.Students.Student[0].Value; 

。最初の生徒だけではなく、より一般的な方法が欲しいです。
EDIT:別のXML

<?xml version="1.0" encoding="UTF-8"?> 
<cbn:PaidOrderNotification xmlns:cbn="http://*/3.12.0.0/*.xsd"> 
    <cbn:NotificationDate>2016-07-29T11:59:29.1137865Z</cbn:NotificationDate> 
    <cbn:Purchase cbt:Id="95233035" xmlns:cbt="http://xml.*.com/3.12.0.0/*.xsd"> 
     <cbt:Status>Test Order</cbt:Status> 
     <cbt:StatusId>TST</cbt:StatusId> 
     <cbt:Items> 
      <cbt:Item cbt:RunningNo="1"> 
       <cbt:ProductId>175358</cbt:ProductId> 
       <cbt:ProductReportingGroup>Basic alle Laufzeiten</cbt:ProductReportingGroup> 
       <cbt:YourCurrencyId>EUR</cbt:YourCurrencyId> 
       <cbt:ProfitCalculation> 
        <cbt:GrossRevenue>566.44</cbt:GrossRevenue> 
       </cbt:ProfitCalculation> 
       <cbt:YourPrice> 
        <cbt:TotalTotalPrice> 
        </cbt:TotalTotalPrice> 
       </cbt:YourPrice> 
       <cbt:Deliveries /> 
       <cbt:Additionals /> 
       <cbt:ExtraParameters /> 
      </cbt:Item> 
     </cbt:Items> 
     <cbt:ExtraParameters> 
      <cbt:ExtraParameter> 
       <cbt:Key>x-my-key</cbt:Key> 
       <cbt:Value> x-my-val</cbt:Value> 
      </cbt:ExtraParameter> 
     </cbt:ExtraParameters> 
    </cbn:Purchase> 
</cbn:PaidOrderNotification> 

私はここからこの値を利用したいと思います:

<cbt:ExtraParameters> 
      <cbt:ExtraParameter> 
       <cbt:Key>x-didi</cbt:Key> 
       <cbt:Value>sfsfd</cbt:Value> 
      </cbt:ExtraParameter> 
     </cbt:ExtraParameters> 

はどのように私はそれを行うことができますか?

+3

で動作するようにコードを拡張しました。 3行目で ''を開きますが、6行目で ''を閉じます。あなたはこれを開いておらず、あなたは学生を閉じていません。 – Bobby

+0

申し訳ありませんが、あなたは@ManuToMaticが正しいです、私はコードを提出する前にそれを変更するのを忘れてしまっています。私は今編集: – eg16

答えて

1

あなたのXML文書に名前空間がありますが、あなたの例には含まれていないので、いくつかの値を偽造しなければなりません。

あなたが名前空間のURIを持っていたら、あなたは適切な修飾子

var xml = @" 
    <cbn:Class xmlns:cbn='something' xmlns:cbt='something-else'> 
     <cbt:StudentNr></cbt:StudentNr> 
     <cbt:Students> 
      <cbt:Student> 
       <cbt:Key>x-param-key-studentName-1</cbt:Key> 
       <cbt:Value>x-param-studentSurname-val</cbt:Value> 
      </cbt:Student> 
      <cbt:Student> 
       <cbt:Key>x-param-key-studentName-2</cbt:Key> 
       <cbt:Value>x-param- studentSurname-val</cbt:Value> 
      </cbt:Student> 
     </cbt:Students> 
    </cbn:Class>"; 

var doc = new XmlDocument(); 
    doc.LoadXml(xml); 

var students = doc.SelectSingleNode("//*[local-name() = 'Students']"); 
var nsmgr = new XmlNamespaceManager(doc.NameTable); 
    nsmgr.AddNamespace("cbt", students.NamespaceURI); 

var dictionary = students.SelectNodes("cbt:Student", nsmgr).OfType<XmlElement>() 
    .ToDictionary(student => student.SelectSingleNode("cbt:Key" , nsmgr).InnerText, 
        student => student.SelectSingleNode("cbt:Value", nsmgr).InnerText); 

EDITで文書に見てXmlNamespaceManagerを使用することができます。あなたにもこれを行うことができます:

string studentSurname = ""; 
var dictionary = myData.Class.Students.ToDictionary(student => student.Key, 
                student => student.Value); 
var exists = dictionary.TryGetValue("x-param-key-studentName-1", out studentSurname); 

EDIT2: 2つの異なるcbt:ExtraParameters要素があり、最初の要素は空です。私はあなたのXMLが無効である任意のcbt:ExtraParameter要素

var doc = new XmlDocument(); 
    doc.LoadXml(xml); 

var dictionary = doc.SelectNodes("//*[local-name() = 'ExtraParameter']") 
    .OfType<XmlElement>() 
    .ToDictionary(
     extra => extra.SelectSingleNode("*[local-name() = 'Key' ]").InnerText, 
     extra => extra.SelectSingleNode("*[local-name() = 'Value']").InnerText 
    ); 

var studentSurname = ""; 
var exists = dictionary.TryGetValue("x-my-key", out studentSurname); 
+0

var _extraParameters = doc.SelectSingleNodeからのカウント( "// * [ローカル名()= 'ExtraParameters']");私はxmlのようなノードを持っていますが、0です。 – eg16

+1

そのノードはあなたの例には存在しません。とにかく、XMLの大文字と小文字の区別に注意してください –

+0

ごめんなさい:_extraParameters = doc.SelectSingleNode( "// * [local-name()= 'Students']"); コメントに私の間違いでした – eg16

関連する問題