Как проанализировать и обновить файл XML с помощью xmltextreader или xmlreader - PullRequest
1 голос
/ 15 сентября 2011

Привет, у меня есть следующий код для чтения XML-файла и изменения значения определенного узла, но я хочу сделать то же самое, используя xmltextreader или xmlreader, я пытаюсь избежать оператора doc.Save(System.Web.HttpContext.Current.Server.MapPath("Data/Example.xml"));, который имеет прямую ссылку на мой физический файл.

XmlDocument doc = new XmlDocument();
                   string xmlFile = System.Web.HttpContext.Current.Server.MapPath("Data/Example.xml");
                   doc.Load(xmlFile);
                   XmlNodeList xmlnode = doc.GetElementsByTagName("value");
                   xmlnode[0].ChildNodes[0].Value = 23;
 doc.Save(System.Web.HttpContext.Current.Server.MapPath("Data/Example.xml"));

Ответы [ 2 ]

2 голосов
/ 15 сентября 2011

Ну что-то должно иметь ссылку на файл. Тем не менее, вы можете легко изменить свой код так, чтобы он просто принимал Stream (который должен быть доступен для чтения, записи и поиска):

private static void ChangeDocument(Stream stream)
{
    XmlDocument doc = new XmlDocument();
    doc.Load(stream);
    XmlNodeList xmlnode = doc.GetElementsByTagName("value");
    xmlnode[0].ChildNodes[0].Value = 23;
    stream.Position = 0;
    doc.Save(stream);
    stream.SetLength(stream.Position); // Truncate the file if it was longer
}

Это немного некрасиво, по общему признанию ...

Конечно, вы всегда можете передать само имя файла - ваш вызов MapPath будет по-прежнему выполняться в методе более высокого уровня, что может быть всем, чего вы пытаетесь достичь:

private static void ChangeDocument(string filename)
{
    XmlDocument doc = new XmlDocument();
    doc.Load(filename);
    XmlNodeList xmlnode = doc.GetElementsByTagName("value");
    xmlnode[0].ChildNodes[0].Value = 23;
    doc.Save(filename);
}

И напоследок - если вы используете .NET 3.5 или выше, я настоятельно рекомендую использовать LINQ to XML в качестве более приятного XML API.

1 голос
/ 15 сентября 2011

Вы не можете записывать или обновлять данные XML, используя XmlTextReader или XmlReader ansectors, используйте XmlTextWriter или XmlWriter предки, ot XmlSerializer.Serialize (..) метод в качестве альтернативы.

Вы не можете избежать утверждения и так,

doc.Save(System.Web.HttpContext.Current.Server.MapPath("Data/Example.xml"));

, который имеет прямую ссылку на ваш физический файл, потому чтоВы должны снова записать измененные узлы обратно в исходный файл, иначе вам придется переключить свою систему с файлового подхода (веб-сайт ASP.NET с использованием файлового хранилища данных) на подход, основанный на базе данных (ASP.NET веб)сайт с использованием сервера базы данных).

В качестве альтернативы, используйте свои собственные данные XML на своем сервере SQL, а затем загрузите и обновите их, используя EF of ORM.

...