Search code examples
c#.netxmlxquery

Сan you help write program in in C# that matches the translation of a phrase to English phrases in an XML document?


I have a string array with an english version and a string array with a russian translation XML document looks like this

<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>

I tried to first delete the node with the ru_RU attribute and write a new node with the translation, but I got the error "Object reference not set to an instance of an object"


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");


Solution

  • Here's how I would do this:

        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("Клиент");
        }
    

    And that gives me:

    <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>