実際のXMLにはルート要素が1つしかありません。あなたはルート要素として 'Response'、 'Count'、 '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をチェックするのを忘れていたと確信しています。そのため、コードを自分でチェックしてから使用してください。