Как распарсить следующий XML?
Есть XML файл:
<ValCurs Date="01.05.2021" name="Foreign Currency Market">
<Valute ID="R01010">
<NumCode>036</NumCode>
<CharCode>AUD</CharCode>
<Nominal>1</Nominal>
<Name>Австралийский доллар</Name>
<Value>58,1546</Value>
</Valute>
<Valute ID="R01020A">
<NumCode>944</NumCode>
<CharCode>AZN</CharCode>
<Nominal>1</Nominal>
<Name>Азербайджанский манат</Name>
<Value>44,0524</Value>
</Valute>
<Valute ID="R01035">
<NumCode>826</NumCode>
<CharCode>GBP</CharCode>
<Nominal>1</Nominal>
<Name>Фунт стерлингов Соединенного королевства</Name>
<Value>104,1694</Value>
</Valute>
<Valute ID="R01060">
<NumCode>051</NumCode>
<CharCode>AMD</CharCode>
<Nominal>100</Nominal>
<Name>Армянских драмов</Name>
<Value>14,3761</Value>
</Valute>
</ValCurs>
http://www.cbr.ru/scripts/XML_daily.asp XML Взял с этого ресурса.
Проблема в десериализации XML файла. Вот пример классов и вывод информации для проверки в Main.
На данный момент выдает ошибку
InvalidOperationException: ValCurs xmlns='' was not expected.
Уточнение: использую .Netcore 3.1
[Serializable()]
[XmlRoot(ElementName = "ValCurs")]
class CurrencyClass
{
[XmlElement(ElementName = "Valute")]
public List<Valute> Valutes { get; set; }
}
[Serializable()]
class Valute
{
[XmlAttribute(AttributeName = "ID")]
public string ID { get; set; }
[XmlElement(ElementName = "NumCode")]
public string NumCode { get; set; }
[XmlElement(ElementName = "CharCode")]
public string CharCode { get; set; }
[XmlElement(ElementName = "Nominal")]
public string Nominal { get; set; }
[XmlElement(ElementName = "Name")]
public string Name { get; set; }
[XmlElement(ElementName = "Value")]
public string Value { get; set; }
}
static void Main(string[] args)
{
var formatter = new XmlSerializer(typeof(DocumentClass));
using (FileStream fs = new FileStream(@"D:\repositivs\ConsoleApp1\CurValute.xml", FileMode.Open))
{
var currencyTest = (CurrencyClass)formatter.Deserialize(fs);
Console.WriteLine("Объект десериализован");
foreach (Valute valute in currencyTest.Valutes)
{
Console.WriteLine("ID: {0}", valute.ID[0]);
Console.WriteLine("Name: {0} ", valute.Name);
Console.WriteLine("Nominal: {0}", valute.Nominal);
Console.WriteLine("Value: {0} ", valute.Value);
}
}
}
Помимо этого была попытка использовать XmlReader, попытка неудачная.
Ответы (1 шт):
Автор решения: tym32167
→ Ссылка
- Открываем первый попавшийся сервис для конвертации XML в C# классы, копируем туда ваш XML, получаем на выходе
[XmlRoot(ElementName = "Valute")]
public class Valute
{
[XmlElement(ElementName = "NumCode")]
public string NumCode { get; set; }
[XmlElement(ElementName = "CharCode")]
public string CharCode { get; set; }
[XmlElement(ElementName = "Nominal")]
public string Nominal { get; set; }
[XmlElement(ElementName = "Name")]
public string Name { get; set; }
[XmlElement(ElementName = "Value")]
public string Value { get; set; }
[XmlAttribute(AttributeName = "ID")]
public string ID { get; set; }
}
[XmlRoot(ElementName = "ValCurs")]
public class ValCurs
{
[XmlElement(ElementName = "Valute")]
public List<Valute> Valute { get; set; }
[XmlAttribute(AttributeName = "Date")]
public string Date { get; set; }
[XmlAttribute(AttributeName = "name")]
public string Name { get; set; }
}
Можно ещё в студии использовать PasteSpecial->XML as classes, там будет что то похожее, только чуть более многословное.
2.
static void Main(string[] args)
{
Console.OutputEncoding = Encoding.UTF8; // для кирилицы
var serializer = new XmlSerializer(typeof(ValCurs));
using var reader = new StringReader(xml);
var obj = serializer.Deserialize(reader) as ValCurs;
Console.WriteLine($"{obj.Date} | {obj.Name}");
foreach (var v in obj.Valute)
Console.WriteLine($"{v.ID} | {v.Name} | {v.Nominal} | {v.NumCode} | {v.Value}");
}
Сама строка
static string xml =
@"<ValCurs Date=""01.05.2021"" name=""Foreign Currency Market"">
<Valute ID=""R01010"">
<NumCode>036</NumCode>
<CharCode>AUD</CharCode>
<Nominal>1</Nominal>
<Name>Австралийский доллар</Name>
<Value>58,1546</Value>
</Valute>
<Valute ID=""R01020A"">
<NumCode>944</NumCode>
<CharCode>AZN</CharCode>
<Nominal>1</Nominal>
<Name>Азербайджанский манат</Name>
<Value>44,0524</Value>
</Valute>
<Valute ID=""R01035"">
<NumCode>826</NumCode>
<CharCode>GBP</CharCode>
<Nominal>1</Nominal>
<Name>Фунт стерлингов Соединенного королевства</Name>
<Value>104,1694</Value>
</Valute>
<Valute ID=""R01060"">
<NumCode>051</NumCode>
<CharCode>AMD</CharCode>
<Nominal>100</Nominal>
<Name>Армянских драмов</Name>
<Value>14,3761</Value>
</Valute>
</ValCurs>";
}
