2017-10-29 1 views
-3

私はxmlから必要なものの値を選択するためにforeachループを使用しないで方法を見つけようとしています。兄弟値に基づいて値を選択する

ここにXMLがあります。

<?xml version="1.0"?> 
<Response xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<Count>116</Count> 
<Message>Results returned successfully</Message> 
<SearchCriteria>VIN:KM8JM12B66U253804</SearchCriteria> 
<Results> 
    <DecodedVariable> 
     <VariableId>10</VariableId> 
     <Variable>Destination Market</Variable> 
    </DecodedVariable> 
    <DecodedVariable> 
     <VariableId>26</VariableId> 
     <Variable>Make</Variable> 
     <ValueId>498</ValueId> 
     <Value>HYUNDAI</Value> 
    </DecodedVariable> 
    <DecodedVariable> 
     <VariableId>27</VariableId> 
     <Variable>Manufacturer Name</Variable> 
     <ValueId>1034</ValueId> 
     <Value>HYUNDAI-KIA AMERICA TECHNICAL CENTER INC (HATCI)</Value> 
    </DecodedVariable> 
    <DecodedVariable> 
     <VariableId>28</VariableId> 
     <Variable>Model</Variable> 
     <ValueId>2058</ValueId> 
     <Value>Tucson</Value> 
    </DecodedVariable> 
    <DecodedVariable> 
     <VariableId>29</VariableId> 
     <Variable>Model Year</Variable> 
     <ValueId/> 
     <Value>2006</Value> 
    </DecodedVariable> 
</Results> 

IはHYUNDAIvariabileId = 26の値を選択する方法、第二DecodedVariableノードを使用してLINQを使用して?

答えて

1

実際のXMLにはルート要素が1つしかありません。あなたはルート要素として 'Response'、 'C​​ount'、 'Message'、 'SearchCriteria'、 'Results'を持っています。また、「応答」タグを閉じる必要があります。このようになります

クレート構造は:

<?xml version="1.0"?> 
<Content> 
    <Response xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <Count>116</Count> 
    ... 
</Content> 

その後、System.Xml.Linq.XDocument.Parse()XDocument.Load()を使用してXMLを読み込むことができます。

以下は、探している値に到達するための例です。

//Load XML 
XDocument document = XDocument.Parse("<?xml version=\"1.0\"?><Content><Count>116</Count><Message>Results returned successfully</Message><SearchCriteria>VIN:KM8JM12B66U253804</SearchCriteria><Results> <DecodedVariable>  <VariableId>10</VariableId>  <Variable>Destination Market</Variable> </DecodedVariable> <DecodedVariable>  <VariableId>26</VariableId>  <Variable>Make</Variable>  <ValueId>498</ValueId>  <Value>HYUNDAI</Value> </DecodedVariable> <DecodedVariable>  <VariableId>27</VariableId>  <Variable>Manufacturer Name</Variable>  <ValueId>1034</ValueId>  <Value>HYUNDAI-KIA AMERICA TECHNICAL CENTER INC (HATCI)</Value> </DecodedVariable> <DecodedVariable>  <VariableId>28</VariableId>  <Variable>Model</Variable>  <ValueId>2058</ValueId>  <Value>Tucson</Value> </DecodedVariable> <DecodedVariable>  <VariableId>29</VariableId>  <Variable>Model Year</Variable>  <ValueId/>  <Value>2006</Value> </DecodedVariable></Results></Content>"); 
//Select root Element 
var root = document?.Root; 
//Go down to the 'Results' element. There is just a single element so use 'Element()' 
var results = root?.Element("Results"); 
//Get every 'DecodedVariable'. There are multiple elements so use 'Elements()' 
var decodedVariables = results?.Elements("DecodedVariable"); 
//Select the only element with 'VariableId'==26 or null if no element maches 
var value = decodedVariables?.SingleOrDefault((decodedVariable) => 
//Do the following for every element 'DecodedVariable' 
{ 
    //Try parse the 'VariableId' as int 
    if (int.TryParse(decodedVariable?.Element("VariableId")?.Value, out int id)) 
     //Compare the value of 'VariableId' with the value you're looking for. In this case 26 
     if (id == 26) 
      //This is the correct 'DecodedVariable' element 
      return true; 
    //This is not the correct 'DecodedVariable' element 
    return false; 
}) 
//Get the element 'Value' from the element 'DecodedVariable' then get the value from the element 'Value' 
?.Element("Value")?.Value; 

//'HYUNDAI' is stored in 'value' 
Console.WriteLine(value); 

どこでもnullがあります。 XElement.Elements()は、一致する要素が見つからない場合にnullを返します。だから私は?.を使ったのです。あらかじめスキーマと照合して検証する必要があるかもしれません。あなたはこれをしないか、あなたのXMLが有効ではないことに気づいたでしょうが。

'VariableId'をintに解析する必要はありません。また、文字列として== 26.ToString()と比較することもできます。

私はいくつかの場所でnullをチェックするのを忘れていたと確信しています。そのため、コードを自分でチェックしてから使用してください。

関連する問題