【问题标题】:how to edit utf-16 xml file if it have string line after the end of the main Node如果主节点结束后有字符串行,如何编辑 utf-16 xml 文件
【发布时间】:2014-04-26 13:14:34
【问题描述】:

我有 utf-16 编码类型的特殊 XML 文件。此文件用于存储数据,我需要使用 C# windows 窗体应用程序编辑它

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

问题是:它不是普通的 XML 文件 因为在文件的最后我也有一个字符串行,这会给出这个错误

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

当我尝试将其加载为 xml 文件时

我尝试临时替换最后一行并在更改内部文本后将其取回,并且它可以工作但是我丢失了声明行并且当我在末尾有该文本时我没有找到重写它的方法文件!_
所以我需要更改(Serie)和(No)节点的InnerText 但我不想丢失文件末尾的声明行或字符串文本

【问题讨论】:

    标签: c# xml declaration utf-16 innertext


    【解决方案1】:

    试试这段代码:

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

    希望对你有帮助

    【讨论】:

    • A.Khatri :它不起作用.. 可能是因为它是大文件(dataset4 中有 200 万个字符)并且它没有说明如何更改 ineer 文本!
    • 使用您提供的 xml,它工作正常。您必须尝试编辑内部文本作品,因为谷歌充满了帮助。
    • 也许你想念了解我.. 我知道如何更改内部文本,但是使用此文件我不能,我的问题是如何更改它。谷歌上对此一无所知,这是最后一行的特殊情况!
    • 是在文件末尾还是在&lt;/cProgram&gt;之后?
    • 两者。它是 XML 文件中的最后一行,在 '' 之后,正如我提供的那样。
    【解决方案2】:

    XDocument.Save() 如果声明最初存在,则应保留 XML 声明行。我还检查了您的 XML 并按预期保存了声明行:

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

    所以你可以实现你的想法来临时替换最后一行并在更改内部文本后将其取回。

    仅供参考,XDocument.ToString() 方法不写 XML 声明行,但 .Save() 方法可以。与此相关的问题:How to print <?xml version="1.0"?> using XDocument

    【讨论】:

    • 我发现问题出在哪里......它在编码 C# 时使用 UTF-8 作为默认值。文本是 UTF-16,我的 xml 文件也是 UTF-16。感谢您的帮助并期待我的新答案
    【解决方案3】:

    请允许我回答我的问题 当我使用 doc.Load(filepath);它总是给出令人不安的最后一行的错误原因 和 C# 使用 UTF-8 作为默认值来处理 xml 文件。但在这个问题中它是 UTF-16 因此,我找到了一种非常简短的方法来执行此操作并根据需要用字符串替换内部文本

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

    与此 [博客] 相关的问题:How to save this string into XML file?“它与答案相关比与问题相关”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-20
      • 2018-02-18
      • 2016-10-02
      • 1970-01-01
      • 2022-11-06
      • 2020-07-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多