我已经很久没有来过这里了,我忘记了之前的帐号!无论如何,我正在解析一个丑陋的xml文档。它适用于银行对账单。每行是<statement>all tags</statement>
。现在,我需要做的是读取此文件,并同时解析XML文档,同时将其格式化为更具人性化。点好,
原始输入如下:
<statement><accountHeader><fiAddress></fiAddress><accountNumber></accountNumber><startDate>20140101</startDate><endDate>20140228</endDate><statementGroup>1</statementGroup><sortOption>0</sortOption><memberBranchCode>1</memberBranchCode><memberName></memberName><jointOwner1Name></jointOwner1Name><jointOwner2Name></jointOwner2Name></summary></statement>
<statement><accountHeader><fiAddress></fiAddress><accountNumber></accountNumber><startDate>20140101</startDate><endDate>20140228</endDate><statementGroup>1</statementGroup><sortOption>0</sortOption><memberBranchCode>1</memberBranchCode><memberName></memberName><jointOwner1Name></jointOwner1Name><jointOwner2Name></jointOwner2Name></summary></statement>
<statement><accountHeader><fiAddress></fiAddress><accountNumber></accountNumber><startDate>20140101</startDate><endDate>20140228</endDate><statementGroup>1</statementGroup><sortOption>0</sortOption><memberBranchCode>1</memberBranchCode><memberName></memberName><jointOwner1Name></jointOwner1Name><jointOwner2Name></jointOwner2Name></summary></statement>
我需要最终输出如下:
<statement>
<name></name>
<address></address>
</statement>
这很好,很花哨。我正在使用以下#34;非常慢,考虑到510万行,254k数据文件和大约60k语句需要大约8分钟&#34;。
foreach(String item in lines)
{
XElement xElement = XElement.Parse(item);
sr.WriteLine(xElement.ToString().Trim());
}
然后当文件被格式化时,这很糟糕。我需要检查事务元素中的每个标记,如果缺少可能存在的标记,我必须填写它。如果标记可行,我们的设计器软件将默认先前的值,并且当前对象没有。它默认为前一个非Null的值。 &#34;我知道,他们发誓上下不是一个错误......好吗?&#34;
所以,这也需要大约5到10分钟。我需要打破这一切,找到一种更快的方法来处理初始XML。这是一个预处理操作,如果没有必要,则不能花费那么长时间。这似乎是多余的。
有没有更好的方法来解析XML,或者这是我能做的最好的方法吗?我解析XML,写入临时文件,然后将该文件读入插入缺失标记的输出文件。 2个IO运行一个进程。呸。
答案 0 :(得分:1)
您可以尝试修改for循环,看看是否能为您加速:
XElement root = new XElement("Statements");
foreach(String item in lines)
{
XElement xElement = XElement.Parse(item);
root.Add(xElement);
}
sr.WriteLine(root.ToString().Trim());
嗯,我不确定这是否有助于解决内存问题。如果它有效,您将获得多个xml文件。
int fileCount=1;
int count = 0;
XElement root;
Action Save = () => root.Save(string.Format("statements{0}.xml",fileCount++));
while(count < lines.Length) // or lines.Count
try
{
root = new XElement("Statements");
foreach(String item in lines.Skip(count))
{
XElement xElement = XElement.Parse(item);
root.Add(xElement);
count++;
}
Save();
}
catch (OutOfMemoryException)
{
Save();
root = null;
GC.Collect();
}
答案 1 :(得分:1)
xmllint单行文件--format> output.xml