C # ReadXML с прямоугольником - PullRequest
0 голосов
/ 21 марта 2019

У меня есть набор данных "AllEventData", и в этом наборе данных (на данный момент) есть только одна таблица с именем buttonData. Он имеет 3 столбца - первичный ключ с автоинкрементным числом, имя (typeof (строка)) и прямоугольник. Третий столбец специально typeof (Rectangle). Я показываю все это с панелью данных.

Я сделал метод AllEventData.WriteXML, чтобы записать файл без специальных параметров, и это, кажется, работает нормально - я получил файл, который выглядит следующим образом:

<?xml version="1.0" standalone="yes"?>
<AllEventData>
  <ButtonData>
    <ID>1</ID>
    <Button_x0020_Name>sdfh</Button_x0020_Name>
    <Button_x005F_x0020_Location xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <Location>
        <X>480</X>
        <Y>186</Y>
      </Location>
      <Size>
        <Width>95</Width>
        <Height>67</Height>
      </Size>
      <X>480</X>
      <Y>186</Y>
      <Width>95</Width>
      <Height>67</Height>
    </Button_x005F_x0020_Location>
  </ButtonData>
</AllEventData>

Но когда я выполняю AllEventData.ReadXML для того же файла, он заполняет панель данных только именами кнопок, а не местами прямоугольников.

Я попытался сделать запись схемы отдельно:

        using (SaveFileDialog saveFileDialog1 = new SaveFileDialog())
        {
            saveFileDialog1.Filter = "XML | *.xml";
            saveFileDialog1.Title = "Save File";
            if (saveFileDialog1.ShowDialog() == DialogResult.OK)
            {
                AllEventData.WriteXml(saveFileDialog1.FileName);
                string xsdFileName = saveFileDialog1.FileName.Substring(0, saveFileDialog1.FileName.Length - 3) + "xsd";
                AllEventData.WriteXmlSchema(xsdFileName);
            }
        }

и то же самое в обратном порядке, чтобы прочитать его со схемой:

        using (OpenFileDialog openFileDialog1 = new OpenFileDialog())
        {
            openFileDialog1.Filter = "XML | *.xml";
            openFileDialog1.Title = "Open File";
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                AllEventData.Clear();
                string xsdFileName = openFileDialog1.FileName.Substring(0, openFileDialog1.FileName.Length - 3) + "xsd";
                AllEventData.ReadXmlSchema(xsdFileName);
                AllEventData.ReadXml(openFileDialog1.FileName);

            }
        }

Но все еще не туда добраться.

Почему ReadXML не работает, чтобы прочитать то, что написал WriteXML?

1 Ответ

0 голосов
/ 22 марта 2019

Как отмечает Оливье в комментариях, прямоугольники слишком сложны для XML, даже если они могут разбить их на части и выглядеть так, как будто все будет работать нормально. Нет никакого способа, которым это когда-либо прочитает это, даже со схемой, так же, как это пишет это. Таким образом, «хитрость» в правильном чтении заключается в следующем:

  1. Напишите блок кода для разбора XML, как указано в ссылке «Как разобрать xml»
  2. Сериализация и десериализация прямоугольника, как указано в ссылке «Как сериализовать / десериализацию»
  3. Прежде всего, храните данные совершенно иначе в таблице.

Последнее было тем, что я в конечном итоге выбрал. Мне действительно легко извлечь X, Y, Width и Height из прямоугольника и сохранить их в отдельных столбцах таблицы (что также позволило мне сохранить еще один фрагмент данных, который я пытался выяснить, как добавить), и затем превращайте их обратно в прямоугольники позже, когда они мне понадобятся, и это также облегчает редактирование прямоугольников для пользователя.

Делая это, я могу просто AllEventData.WriteXML и AllEventData.ReadXML без дополнительного кода.

...