У меня есть массив строк с английской версией и массив строк с русским переводом XML-документ выглядит так
<messages>
<message id = "1">
<variant language = "en_US">Customer</variant>
<variant language = "ru_RU"/>
</message>
<message id = "2">
<variant language = "en_US">Model</variant>
<variant language = "ru_RU"/>
</message>
</messages>
Пробовал сначала удалить узел с атрибутом ru_RU и написать новый узел с переводом, но получил ошибку "Ссылка на объект не установлена на экземпляр объекта"
mlDocument xml = new XmlDocument();
xml.Load(@"C:\Users\User\source\repos\TestZad2\TestZad2\ViewerMessages.xml");
XmlElement element = xml.DocumentElement;
if (element.Attributes["variant language"].Value == "ru_RU")
{
xml.RemoveChild(element);
}
xml.Save(@"C:\Users\User\source\repos\TestZad2\TestZad2\ViewerMessages.xml");
Какого фактического результата вы хотите, и откуда вы собираетесь взять перевод?
Какой у вас есть? Два массива строк или XML-документ? Если у вас есть XML, используйте XDocument
, а не XmlDocument
.
Бьюсь об заклад, что когда это исключение выдается, вы можете сказать, из какой строки оно выбрасывается. Мы тоже хотели бы знать! Тем не менее, я уверен, что это if (element.Attributes...
. Вы вообще отладили это. Вы загружаете документ, а затем смотрите на первый элемент (единственный, на который вы когда-либо смотрели) и смотрите на его атрибуты. Его нет, так что бум. Подумайте о том, что вы пытаетесь сделать. С XML у вас есть иерархия элементов, и вы, вероятно, захотите их обойти.
Вот как бы я это сделал:
var document = XDocument.Parse(@"<messages>
<message id = ""1"">
<variant language = ""en_US"">Customer</variant>
<variant language = ""ru_RU""/>
</message>
<message id = ""2"">
<variant language = ""en_US"">Model</variant>
<variant language = ""ru_RU""/>
</message>
</messages>");
var variant =
(
from m in document.Root.Elements("message")
where (int)m.Attribute("id") == 1
from v in m.Elements("variant")
where (string)v.Attribute("language") == "ru_RU"
select v
).FirstOrDefault();
if (variant != null)
{
variant.SetValue("Клиент");
}
И это дает мне:
<messages>
<message id = "1">
<variant language = "en_US">Customer</variant>
<variant language = "ru_RU">Клиент</variant>
</message>
<message id = "2">
<variant language = "en_US">Model</variant>
<variant language = "ru_RU" />
</message>
</messages>