【发布时间】:2019-11-08 12:31:28
【问题描述】:
我正在尝试将 XML 文件转换为 CSV,但我正在运行的 .NET 版本不支持这里似乎很流行的 CsvHelper 库。
XML 文档简化如下:
<E1AFKOL SEGMENT="1">
<MATNR>456654546</MATNR>
<E1AFFLL SEGMENT="1">
<APLZL>00000001</APLZL>
<E1AFVOL SEGMENT="1">
<VORNR>0020</VORNR>
<E1RESBL SEGMENT="1">
<AUSCH>0.00</AUSCH>
</E1RESBL>
<E1RESBL SEGMENT="1">
<AUSCH>0.00</AUSCH>
<BDART>AR</BDART>
<BDMNG>1.000</BDMNG>
<BDTER>20190626</BDTER>
<MATNR>LD1000345</MATNR>
<MEINS>EA</MEINS>
<VMENG>1.000</VMENG>
<WERKS>1110</WERKS>
</E1RESBL>
</E1AFVOL>
</E1AFFLL>
</E1AFKOL>
我只需要第0列的MATNR标签(Primary Key)。E1RESBL标签的内容是需要添加的值(第1-6列)但并非结构中的所有标签都是必需的。
我将 XML 文档作为 XElement 和列名列表传递。它返回一个列表中的所有值。
public static List<string> makeRows(XElement xmlD, List<string> columnNames) {
List<string> columnNames = new List<string>();
string[] wkOrdColumnNames = { "AUFNR", "AUSCH", "BDMNG", "BDTER", "MATNR", "MEINS", "WERKS" }; // all other fields needed
columnNames.AddRange(wkOrdColumnNames); // adds the others
// Load each structure
var E1RESBL = xmlD.XPathSelectElements(@"/IDOC/E1AFKOL/E1AFFLL/E1AFVOL/E1RESBL"); // XML structure within doc
var E1AFKOL = xmlD.XPathSelectElements(@"/IDOC/E1AFKOL"); // column0 structure
List<string> tagValues = new List<string>(); // all values from the tags are stored here
// Where the WorkOrderID is added to the the values
foreach (var innerNode in E1AFKOL) { // loops through the parent structure
foreach (var innerElement in innerNode.XPathSelectElements(columnNames[0])) // passes the element(AUFNR), gets the value of that tag
tagValues.Add(innerElement.Value); // adds it to the List
}
// The rest of the fields are added here
foreach (var innerNode in E1RESBL) { // loops through all tags in E1RESBL structure
foreach (string i in columnNames) { // loops through each string in the array of column names
foreach (var innerElement in innerNode.XPathSelectElements(i))
tagValues.Add(innerElement.Value);
}
}
return tagValues;
}
然后我将列名和值传递给 DataTable。
public static DataTable makeDataTable(List<string> columns, List<string> rows) {
// Make Data table
DataTable dataT = new DataTable();
DataColumn dCol = new DataColumn();
// Add columns
foreach (var i in columns) {
dCol.DataType = Type.GetType("System.String");
dCol.ColumnName = i;
dataT.Columns.Add(dCol.ColumnName, dCol.DataType);
}
// Add rows
dataT.Rows.Add(rows[0]); // adds to column 0
for (int r = 1; r < (rows.Capacity-1); r++) { // starts after the 0th element (wkOrdID)
DataRow dr = dataT.NewRow(); // Adds a new row
Console.WriteLine(rows[r]);
for (int j = 1; j < 7; j++) { // skips the 0th column
dr[j] = rows[r]; // adds the values of the list to the row
}
dataT.Rows.Add(dr);
}
我知道可能有一种更简单的方法可以做到这一点,如果您能提供帮助,将不胜感激。
【问题讨论】:
-
尝试使用 Linq to XML。更少的代码,并且在不破坏代码的情况下更容易进行未来的更改docs.microsoft.com/en-us/dotnet/csharp/programming-guide/…
-
您说“不支持”,我们可能有您正在运行的 .net 版本。因为解决方案可能包含不支持的语法等。
-
这是 SQL Server 2008 R2 和 .NET 3.5