c# - 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 的原因。我对如何做到这一点的其他方法持开放态度。
解决方案
这是一种工作方法:
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);
}
}
推荐阅读
- haskell - 不在范围内:类型构造函数或类“-”(以及反转列表时的其他错误)
- asp.net-core - 在 URL 末尾添加斜杠
- java - 如何使用 Java 流打印嵌套列表,其中 Object 包含对其自身的引用列表
- c++ - 用于 ASCII 的环绕式 c++
- vba - Set a sub-form hidden field to visible, based on a check box status
- haskell - 如何将 Haskell 异常用于索引负数
- python - 使用 Pandas 更改标签行
- eclipse - Eclipse dark theme bug after uninstalling
- javascript - 防止mouseleave函数中断mouseenter
- python - Rentry to numpy 函数返回错误:float object has no attribute exp