Question

I have Special XML file with utf-16 encoding type. this file used to store data and I need to Edit it Using C# windows forms Application

<?xml version="1.0" encoding="utf-16"?>
<cProgram    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" ID="b0eb0c7e-f4de-4bc7-9e62-7a086a8c2fn8" Version="16.01" xmlns="cProgram">
  <Serie>N    </Serie>
  <No>123456</No>
  <type>101</type>
  <Dataset4>larg data here 2 million char</Dataset4>
</cProgram>123456FF896631N    4873821012013-06-14

the problem is: it is not ordinary XML file Because at the very End of the file I have a string line too, and that would give this error

Data at the root level is invalid. Line x, position x

when I try to load it as xml file

I tried to temporary replace the last line and get it back after I change the inner text, and it works But I lost the declaration Line and I didn't find a way to rewrite it when I have that text at the end of the file !_
so I need to change the InnerText of (Serie) and (No) nodes but I don't Want to lose the declaration Line or the string text at the end of the file

Was it helpful?

Solution 3

allow me to answer my question when I used doc.Load(filepath); it always give Error cause of the disturbing last Line and C# use UTF-8 as defaults to work with xml files.But in this question it is UTF-16 So I found a very short way to do this & replace innertext with string as I want

 string text = File.ReadAllText(filepath);
        text = text.Replace("<Serie>N", "<Serie>"+textBox1.Text);
        text = text.Replace("<Nom>487382","<Nom>"+textBox2.Text);
       //saving file with UTF-16
        File.WriteAllText("new.xml", text , Encoding.Unicode);

Question related to this [blog]: How to save this string into XML file? "it is much more answer related than being Question related"

OTHER TIPS

try this piece of code:

string line = "";
string[] stringsperate = new string[] { "</cProgram>" };
using (StreamReader sr = new StreamReader("C://blah.xml"))
{
     line = sr.ReadToEnd();
     Console.WriteLine(line);
}
string text = line.Split(stringsperate, StringSplitOptions.None)[0];
text += "</cProgram>";
XmlDocument xd = new XmlDocument();
xd.LoadXml(text);
Console.Read();

Hope this helps

XDocument.Save() should persist the XML declaration line if the declaration exists initially. I also checked with your XML and the declaration line saved as expected :

var xml = @"<?xml version=""1.0"" encoding=""utf-16""?>
<cProgram    xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" ID=""b0eb0c7e-f4de-4bc7-9e62-7a086a8c2fn8"" Version=""16.01"" xmlns=""cProgram"">
  <Serie>N    </Serie>
  <No>123456</No>
  <type>101</type>
  <Dataset4>larg data here 2 million char</Dataset4>
</cProgram>";
var doc = XDocument.Parse(xml);
doc.Save("test.xml");

So you can implement your idea to temporarily replacing the last line and get it back after changing the inner text.

Fyi, XDocument's .ToString() method doesn't write XML declaration line, but .Save() method does. Question related to this : How to print <?xml version="1.0"?> using XDocument

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top