如何替换大型XML文件中的文本

时间:2014-04-25 19:37:01

标签: xml vb.net streamreader

当我尝试删除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()

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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

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

在处理XML文件时,通常不应该以纯文本的方式进行操作。相反,您应该选择专门用于处理XML的专用库。 Microsoft在其文章XML Processing Options中列出了许多方法。在 .NET Framework选项标题下,Microsoft说 LINQ To XML ,&#34;如果您要编写新代码,请使用此选项。&#34;

考虑到这一点,我已经在 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>";
    }
}