首页 > 解决方案 > LINQ 读取和格式化 XML 文件然后创建文本文件

问题描述

I got this XML file:


<?xml version="1.0" encoding="UTF-8"?>
<textTables xmlns:xsi="http"
            xsi:noNamespaceSchemaLocation="../texttables.xsd" language="en-US" name="Texttabellen">
    <description>Version: 2020-01-08 --- Automatisch generiert: Wed Jan 08 09:54:17 CET 2020 --- Copyright (c) Volkswagen AG</description>
    <textTable name="DTC-table" version="1-00-000">
        <description>Anzeigetexte zu den Fehlercodes nach VAG bzw. SAE Konvention</description>
        <history>
            <historyInfo date="" author="" version="1-00-000">
                <description></description>
            </historyInfo>
        </history>
        <constraints maxChars="63" maxLines="2"/>
       <text id="U180300">
            <line>Steuergerät für Anzeige Lichtlinie 4</line>
            <line>keine Kommunikation</line>
        </text>
        <text id="U180400">
            <line>Steuergerät für Anzeige Lichtlinie 5</line>
            <line>keine Kommunikation</line>
        </text>
        <text id="U180500">
            <line>Pumpe für Tankentlüftung.</line>
            <line>unplausibles Signal</line>
        </text>
        <text id="U303300">
            <constraints obd="true" obd-key="U303300"/>
            <line>Steuergerät für Zugang- und Startberechtigung</line>
            <line>Zertifikat fehlt oder ungültig</line>
        </text>
        <text id="default">
            <line>Not found</line>
        </text>
        <text id="none">
        <line>Search key</line>
        </text>  
</textTable>
</textTables>

我想要这样的输出:U180300 Steuergerät für Anzeige Lichtlinie 4 keine Kommunikation

到目前为止,这是我的代码中的内容:

StringBuilder result = new StringBuilder();

            //Load xml
            XDocument xdoc = XDocument.Load(filePath);

            //Run query
            var lv1s = from lv1 in xdoc.Descendants("text")
                       select new
                       {
                           Header = lv1.Attribute("id").Value,
                           Children = lv1.Descendants("line")
                       };

            //Loop through results
            foreach (var lv1 in lv1s)
            {
                result.AppendLine(lv1.Header);
                foreach (var lv2 in lv1.Children)
                    result.AppendLine("     " + lv2.Attribute("text").Value);
            }

            Console.WriteLine(result);

文件格式化后,我想将其保存为文本,这就是我使用 stringbuilder 的原因。我对如何做到这一点的其他方法持开放态度。

标签: c#

解决方案


这是一种工作方法:

    public List<string> GetFormatDataLines()
    {
        List<string> allResults = new List<string>();

        StringBuilder result = new StringBuilder();

        //Load xml
        XDocument xdoc = XDocument.Load(PATHTOFILE);
        foreach (var element in xdoc.Descendants("text"))
        {
            result.Append($"{element.Attribute("id")} ");
            var lines = element.Elements("line");
            foreach (var line in lines)
            {
                result.Append($"{line.Value} ");
            }
            allResults.Add(result.ToString());
            result.Clear();
        }

        return allResults;
    }

这里是在文本文件中保存红色的方法:

    public void SaveResult(List<string> results, string pathToSave)
    {
        var filesStream = File.Create(pathToSave); //Create or overwrite existing file
        foreach (var result in results)
        {
            byte[] toWrite = Encoding.Unicode.GetBytes(result + "\n");
            filesStream.Write(toWrite, 0, toWrite.Length);
        }
    }

这是包含元素的列表的样子:

在此处输入图像描述



这是您的文本文件在保存后的样子:

在此处输入图像描述


推荐阅读