解析每行作为一个对象进入的xml文件

时间:2014-08-08 13:28:51

标签: c# .net xml io

我已经很久没有来过这里了,我忘记了之前的帐号!无论如何,我正在解析一个丑陋的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运行一个进程。呸。

2 个答案:

答案 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