解析xml文件,每行一个对象

本文关键字:一个对象 xml 文件 解析 | 更新日期: 2023-09-27 18:17:20

好久没来了,忘了之前的账号!无论如何,我正在解析一个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>

这很好。我正在使用下面的"考虑到510万行,254k数据文件,大约60k语句需要大约8分钟,非常慢"。

foreach(String item in lines)
{
    XElement xElement = XElement.Parse(item);
    sr.WriteLine(xElement.ToString().Trim());
}

然后,当文件被格式化时,这是最糟糕的。我需要检查事务元素中的每个标记,如果缺少可能存在的标记,我必须将其填充。如果标签是可能的,而当前对象没有,我们的设计器软件将默认先验值。它的默认值为先前的非Null值。"我知道,他们发誓说那不是虫子……好吗?"

所以,这也需要大约5到10分钟。我需要分解这一切,并找到一种更快的方法来处理初始XML。这是一个预处理操作,如果没有必要,不能花费那么长时间。这似乎是多余的。

是否有更好的方法来解析XML,或者这是我能做的最好的?我解析XML,写入临时文件,然后将该文件读入输出文件,插入缺少的标记。2个IO为一个进程运行。恶心。

解析xml文件,每行一个对象

你可以先尝试修改一下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();
}

xmllint file-as-one-line——format> output.xml

相关文章: