iOS и Windows читают .xml файлы по-разному C#

195
22 июля 2019, 21:40

Есть проект Xamarin.Forms, внутри есть три приложения (iOS, Android, UWP), один общий проект с общим кодом Portable Class Library. Внутри этого проекта есть общий файл data.xml.

Считываю его таким образом:

var assembly = IntrospectionExtensions.GetTypeInfo(typeof(Facility)).Assembly;
Stream stream = assembly.GetManifestResourceStream("MobilaApp.SharedFiles.data.xml");
GameLoader loader = new GameLoader(stream); 
items = loader.GetFacilities();

И GameLoader.cs:

public GameLoader(Stream stream)
{
    BaseDocument = XDocument.Load(stream);
}
public List<Facility> GetFacilities()
{
    List<Facility> res = new List<Facility>();
    var elements = BaseDocument.Element("Facilities").Elements();
    foreach(var facility in elements)
    {
        string name = facility.Attribute("Name").Value;
        string description = facility.Attribute("Description").Value;
        string type = facility.Attribute("Type").Value;
        var boundariesElements = facility.Element("Boundaries").Elements(); //Key Value pairs
        Dictionary<double, double> boundaries = new Dictionary<double, double>();
        double key, value;
        foreach(var element in boundariesElements)
        {
            string sKey = element.Attribute("Key").Value;
            string sValue = element.Attribute("Value").Value;
            if (double.TryParse(sKey, out key))
            {
                if (double.TryParse(sValue, out value))
                {
                        boundaries.Add(key, value);
                }
            }
        }
        res.Add(new Facility(name, description, boundaries));
    }
    return res;
}

Наконец, data.xml

<?xml version="1.0" encoding="utf-8"?>
<Facilities>
  <Facility Name="Google" Description="This is a standard description." Type="1">
    <Boundaries>
      <KeyValuePair Key="0" Value="100" />
    </Boundaries>
  </Facility>
  <Facility Name="Facebook" Description="This description was created using my command line helper. I hope it works!" Type="0">
    <Boundaries>
      <KeyValuePair Key="0" Value="1.5" />
      <KeyValuePair Key="10" Value="2.5" />
    </Boundaries>
  </Facility>
</Facilities>

Обе программы (Windows и iOS) считывают этот файл, затем обрабытавают его и выводят результат на экран. Проблема в том, что результаты получаются разные:

iOS 12.1, Iphone 7 plus

Windows 10

Answer 1

Спасибо @AlexanderPetrov за решение.

Проблема заключалась в том, что у разных платформ были установлены разные культуры.

Это проявлялось в методе double.TryParse()

if (double.TryParse(sKey, out key)) //Windows принимает числа формата 3.5, а iOS - нет
            {
                if (double.TryParse(sValue, out value))
                {
                    boundaries.Add(key, value); //Эти строчки не выполнялись на iOS, ибо double.TryParse() возвращал false
                }
            }

Решение проблемы

System.Globalization.NumberStyles numberStyles = System.Globalization.NumberStyles.Any;
            System.Globalization.CultureInfo cultureInfo = System.Globalization.CultureInfo.InvariantCulture;
            foreach(var element in boundariesElements)
            {
                string sKey = element.Attribute("Key").Value;
                string sValue = element.Attribute("Value").Value;
                if (double.TryParse(sKey, numberStyles, cultureInfo, out key))
                {
                    if (double.TryParse(sValue, numberStyles, cultureInfo, out value))
                    {
                        boundaries.Add(key, value);
                    }
                }
            }
READ ALSO
Поиск в txt файле

Поиск в txt файле

Имеетсяtxt файл, в котором записан текст

152
PHPUnit. Как глобально замокать метод класса?

PHPUnit. Как глобально замокать метод класса?

Имеется два классаВ классе Two создаем экземпляр класса One в переменную $one

180
Отправка CURL + PHP 7

Отправка CURL + PHP 7

Я использую CURL для отправки файлаЭто работает хорошо, когда я отправляю файл

177
Побитовый сдвиг влево, проблемка

Побитовый сдвиг влево, проблемка

Переписываю некий код с яваскрипта на пхп, должен работать идентично

178