Какое имя метода XmlReader получает текущий путь к файлу? - PullRequest
1 голос
/ 15 января 2020

Мое приложение сохраняет содержимое в файл XML или считывает содержимое из файла XML. Содержание - это структура проекта, и файл XML может существовать везде.

Например, структура файла XML, используемого моим приложением, показана ниже.

<Project version="1">
    <Item Include="A.text"/>
    <Item Include="Folder/A.text"/>
</Project>

Как Вы можете видеть, что тег include для Item является относительным путем, поэтому для открытия элемента требуется путь root. (Путь к файлу проекта)

Структура моего приложения для обработки такая, как показано ниже.

public class Project, IXmlSerializable
{
    public ObservableCollection<Item> Items {get; set;} = new ObservableCollection<Item>();

    public XmlSchema GetSchema() => null;

    public void ReadXml(XmlReader reader)
    {
        // here would read ChildNode (Items)
    }

    public void WriteXml(XmlWriter writer)
    {
        ...
    }
}


public class Item, IXmlSerializable
{
    public XmlSchema GetSchema() => null;

    public void ReadXml(XmlReader reader)
    {
        ...
    }

    public void WriteXml(XmlWriter writer)
    {
        ...
    }
}

И код чтения такой, как показано ниже.

using (StreamReader sr = new StreamReader(message.ProjectFullPath))
{
    XmlSerializer xs = new XmlSerializer(typeof(ProjectStruct));
    this.Projects.Add(xs.Deserialize(sr) as ProjectStruct);
}

Как вы можете видите, я создал запись, читая логи c, выводя IXmlSerializable для использования функции Serialize, DeSerialize.

Когда вызывается метод DeSerialize, вызывается метод Read Xml для ProjectStruct. И метод Read Xml не имеет параметра, отличного от XmlReader, поэтому я не могу передать ProjectFullPath методу Read XML.

Поэтому я считаю, что необходимо получить ProjectFullPath из XmlReader.

Could кто-нибудь подскажет, как имя метода XmlReader получает текущий путь к файлу?

Если у вас есть другой способ решения этой проблемы, пожалуйста, дайте мне знать. Я не зацикливаюсь на своем.

Спасибо за чтение.

1 Ответ

1 голос
/ 15 января 2020

Вы не можете передать ничего, кроме XmlReader, определяемого интерфейсом, методу ReadXml.

В зависимости от того, как вы создаете экземпляр класса Item, вы можете внедрить его с помощью string, который определяет путь:

public class Item(string path)
...

Если вы не можете этого сделать, вам следует включить полный путь в данные XML и прочитать его оттуда.

в крайнем случае можно получить его из свойства c stati Item, которое вы установили перед началом обработки файла XML.

В любом случае вы не можете изменить сигнатуру метода .

...