当我尝试删除xml文件中的文本时,即。 rsquo,我收到'System.OutOfMemoryException'异常错误。
有什么建议吗? - 用vb写的
<Person>
<Name>’ John /’ </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("’") Then
mystr = mystr.Replace("’", "")
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()
答案 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("’") Then
l = l.Replace("’", "")
End If
sw.WriteLine(l)
l = sr.ReadLine
End While
End Using
End Using
答案 1 :(得分:0)
字符序列’
是Unicode Character 'RIGHT SINGLE QUOTATION MARK' (U+2019)的 HTML实体(已命名)。
实体’
实际上不允许在没有首先声明的情况下使用XML:
<!DOCTYPE section [
<!ENTITY rsquo '’'>
]>
在处理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 '’'>
]>
<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>";
}
}