【问题标题】:How to replace text in large XML file如何替换大型 XML 文件中的文本
【发布时间】:2014-04-25 19:37:00
【问题描述】:

当我尝试删除 xml 文件中的文本时,即。 rsquo,我得到一个 'System.OutOfMemoryException' 异常错误。

有什么建议吗? - 用vb写的

   <Person>
   <Name>&rsquo; John /&rsquo; </Name>
   <age> 24 </age>
   <DOB>
      <year> 1990 </year>
      <month> 03 </month>
      <date> 23 </date>
  </DOB>
</Person>

   Dim myStreamReaderL1 As StreamReader
   Dim myStream As StreamWriter
   Dim mystr As String

   myStreamReaderL1 = System.IO.File.OpenText(Server.MapPath( filepath_Label.Text))
   myStr = myStreamReaderL1.ReadToEnd() 
   myStreamReaderL1.Close()

   If mystr.Contains("&rsquo;") Then
     mystr = mystr.Replace("&rsquo;", "")
     count += count + 1
    End If

    myStream = System.IO.File.CreateText(Server.MapPath("Valedate/" & DateTime.Now.ToString("yyyy-MM-dd") & "/new" & TextBox_filename.Text))
    myStream.WriteLine(myStr)
    myStream.Close()

【问题讨论】:

  • 文件有多大,这是否发生在循环中?您可以尝试逐行处理。它可能会慢一点,但你不应该用完内存。
  • 需要考虑的事情:在使用 XML 时考虑使用LINQ to XML
  • 文件为 92.7 MB - 将逐行尝试

标签: xml vb.net streamreader


【解决方案1】:

这是你的错误:

myStr = myStreamReaderL1.ReadToEnd() 

如果您需要对文件中广泛分隔的位置进行重复的非连续访问,则只需要ReadToEnd()。如果你这样做,你不应该使用StreamReader。您不应该使用ReadToEnd() 来执行顺序访问,例如替换每一行的字符串。做这样的事情:

Using sr = System.IO.File.OpenText(Server.MapPath(filepath_Label.Text))
Using sw = System.IO.File.CreateText(Server.MapPath("Valedate/" & DateTime.Now.ToString("yyyy-MM-dd") & "/new" & TextBox_filename.Text))
    Dim l As String
    l = sr.ReadLine
    Do While (Not l Is Nothing)
        If l.Contains("&rsquo;") Then
            l = l.Replace("&rsquo;", "")
        End If

        sw.WriteLine(l)
        l = sr.ReadLine
    End While
End Using
End Using

【讨论】:

  • 谢谢! - 有效!只觉得我数不清变化的数量和Do While ... Loop。
  • 您可以统计If块内的更改量。
  • 我做了,我得到了这个错误:算术运算导致溢出。 - System.OverflowException
  • @user3366527,您必须发布导致错误的代码,因为我看不到您的屏幕。
  • 我修好了!我有 count += count + 1 当它应该是 count += 1
【解决方案2】:

字符序列&amp;rsquo;Unicode Character 'RIGHT SINGLE QUOTATION MARK' (U+2019)HTML 实体(命名)

实体 &amp;rsquo; 在没有事先声明的情况下实际上是不允许在 XML 中使用的:

<!DOCTYPE section [ 
  <!ENTITY rsquo '&#x2019;'> 
]>

在处理 XML 文件时,您通常不应该将其作为纯文本处理。相反,您应该选择专为使用 XML 设计的专用库。 Microsoft 在其文章XML Processing Options 中列出了许多方法。在 .NET Framework 选项 标题下,Microsoft 对 LINQ To XML 表示,“如果您正在编写新代码,请使用此选项。”

考虑到这一点,我用 C# 编写了一个简短的程序来为您演示一种可能的方法。 (我希望您可以将这些概念翻译成 VB。)在下面,您会发现程序本身的预期输出。

预期输出

<Persons>
  <Person>
    <Name> John / </Name>
    <age> 24 </age>
    <DOB>
      <year> 1990 </year>
      <month> 03 </month>
      <date> 23 </date>
    </DOB>
  </Person>
  <Person>
    <Name> Jane / </Name>
    <age> 21 </age>
    <DOB>
      <year> 1993 </year>
      <month> 04 </month>
      <date> 25 </date>
    </DOB>
  </Person>
</Persons>

示例程序

using System;
using System.Linq;
using System.Xml;
using System.Xml.Linq;

class LinqToXmlDemo
{
    static public void Main(string[] args)
    {
        XDocument document = XDocument.Parse(GetXml());

        // Define a LINQ to XML query to return an enumeration of the
        // `Name` elements. (Those are the elements whose values you
        // wish to edit.)
        var query =
            from name in document.Root.Elements("Person").Elements("Name")
            select name;

        // The character that you want to remove.
        string s = Convert.ToChar(0x2019).ToString();

        // Iterate through each of the `Name` elements returned by the
        // query and remove the character of interest.
        foreach (var name in query)
        {
            if (name != null)
            {
                name.Value = ((string)name).Replace(s, String.Empty);
            }
        }

        // Output the edited document.
        Console.WriteLine(document.Root.ToString());
    }

    static string GetXml()
    {
        return
            @"<?xml version='1.0' encoding='UTF-8' ?> 
              <!DOCTYPE section [ 
                <!ENTITY rsquo '&#x2019;'> 
              ]>
              <Persons>
                <Person>
                  <Name>&rsquo; John /&rsquo; </Name>
                  <age> 24 </age>
                  <DOB>
                     <year> 1990 </year>
                     <month> 03 </month>
                     <date> 23 </date>
                  </DOB>
                </Person>
                <Person>
                  <Name>&rsquo; Jane /&rsquo; </Name>
                  <age> 21 </age>
                  <DOB>
                     <year> 1993 </year>
                     <month> 04 </month>
                     <date> 25 </date>
                  </DOB>
                </Person>
              </Persons>";
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-07
    • 2014-01-01
    • 1970-01-01
    • 2021-08-14
    • 2012-06-17
    • 1970-01-01
    相关资源
    最近更新 更多