XML Значения атрибута C# - PullRequest
       10

XML Значения атрибута C#

1 голос
/ 04 февраля 2020

Я пытаюсь получить значение двух атрибутов XML и с трудом пользуюсь Xelement. В основном я получаю ответ API, который использует одно и то же соглашение об именах атрибутов для двух разных значений.

Это ответ, который я получаю после звонка.

    -<ResponseData>    
        <Type value="7" id="Level"/>    
        <Type value="67.80" id="Score"/>    
    </ResponseData>        

Я хочу установить два значения для двух разных переменных. уровень и оценка. У меня есть полный код, но я продолжаю возвращать нулевую ссылку.

var xmlResponse = XElement.Parse(response);
var level = "";
var score = "";
if(xmlResponse.Attribute("id").Value == "Level")
{
    level = (string) xmlResponse.Attribute("value");
}

if(xmlResponse.Attribute("id").Value == "Score")
{
    score = (string) xmlResponse.Attribute("value");
}

Я хочу, чтобы мои две переменные были установлены на значения, которые я получаю от вызова API.

Любая помощь приветствуется

Ответы [ 3 ]

1 голос
/ 04 февраля 2020

Дополнительное замечание: если это SOAP служба с WSDL, вы пытались разрешить Visual Studio ее поменять?

Так что вы должны подумать об этом таким образом ... теперь вы проанализировали XElement является объектом ResponseData, который теперь содержит коллекцию объектов Type, и каждый объект Type имеет атрибуты value и id, что означает, что вам нужно найти правильную запись Type для каждое значение, которое вы ищете. EG:

string data = @"<ResponseData>    
        <Type value=""7"" id=""Level""/>    
        <Type value=""67.80"" id=""Score""/>    
    </ResponseData>";

var xmlResponse = XElement.Parse(data);

var levelElement = xmlResponse.Elements("Type")?
    .FirstOrDefault(x => x.Attribute("id")?.Value == "Level");
var scoreElement = xmlResponse.Elements("Type")?
    .FirstOrDefault(x => x.Attribute("id")?.Value == "Score");

int level;
double score;

level = int.Parse(levelElement?.Attribute("value")?.Value ?? "-1");
score = double.Parse(scoreElement.Attribute("value")?.Value ?? "-1");

Console.WriteLine($"Score {score}; Level {level}");
0 голосов
/ 04 февраля 2020

Я бы порекомендовал использовать XML, с которым PowerShell знает, как работать.

[xml]$xml = Get-Content C:\temp\xml.txt
$TypeNode = $xml.SelectSingleNode("//Type[@id='Score']")
$TypeNode.Attributes["value"].Value 
0 голосов
/ 04 февраля 2020

Почему бы не использовать?

-<ResponseData>    
    <Type Level="7" Score="67.80"/> 
</ResponseData> 
...