【发布时间】:2016-05-03 15:15:36
【问题描述】:
我有一个包含各种元素和属性的 XML 文件。有些对所有人都是通用的,但并非每个节点都具有所有(或相同)节点。示例 XML 如下:
<?xml version='1.0' encoding='UTF-8'?>
<index>
<doc id='0'>
<field name='IDTREE' norm='124' flags='Idfp--S--Ni08--------'>
<val>-</val>
</field>
<field name='role' norm='114' flags='Idfp--S--Ni08--------'>
<val>administrators</val>
</field>
<field name='internalid' norm='117' flags='Idfp--S--Ni08--------'>
<val>123456</val>
</field>
<field name='version' norm='124' flags='Idfp--S--Ni08--------'>
<val>test</val>
</field>
<field name='id' norm='124' flags='Idfp--S--Ni08--------'>
<val>myname-123456-test</val>
</field>
<field name='siteId' norm='124' flags='Idfp--S--Ni08--------'>
<val>myname</val>
</field>
</doc>
<doc id='1'>
<field name='internalid' norm='117' flags='Idfp--S--Ni08--------'>
<val>98765</val>
</field>
<field name='version' norm='124' flags='Idfp--S--Ni08--------'>
<val>dev</val>
</field>
<field name='category' norm='113' flags='Idfp--S--Ni08--------'>
<val>biography</val>
</field>
<field name='display' norm='120' flags='Idfp--S--Ni08--------'>
<val>false</val>
</field>
<field name='publisher' norm='124' flags='Idfp--S--Ni08--------'>
<val>-</val>
</field>
<field name='id' norm='124' flags='Idfp--S--Ni08--------'>
<val>myname-98765-dev</val>
</field>
<field name='siteId' norm='124' flags='Idfp--S--Ni08--------'>
<val>myname</val>
</field>
</doc>
</index>
我想要做的是将这个(非常大的)XML 文件转换为一个文本文件(管道分隔),我可以将其导入 Excel(或 SQL)。我希望输出如下:
id|siteId|version|internalid|role|IDTREE|category|display|publisher 我的名字-123456-测试|我的名字|测试|123456|管理员|-||| myname-98765-dev|myname|dev|98765|||biography|false|-
我想我需要对 XML 数据进行 2 次传递,第一次获取列名,第二次将数据添加到要输出到文本文件的相应字段中。
我知道每个文档至少会有 4 个相同的字段节点:id、siteId、version 和 internalid。其他一切都可能有所不同。
我最初的想法是让1通过XML,将字段的名称属性添加到哈希表中。在第 2 步中,我将使用哈希表循环遍历并将每个字段分配到输出的适当位置。
我现在正在使用它来读取 XML 文件。
$f = [System.Xml.XmlReader]::Create("C:\Test\MyXMLFile.xml")
while ($f.read()) {
switch ($f.NodeType) {
([System.Xml.XmlNodeType]::Element) {
if ($f.Name -eq "doc") {
$e = [System.Xml.Linq.XElement]::ReadFrom($f)
$nbr = [String] $e.Attribute("id").Value
$fields = $e.Descendants("field")
foreach ($fld in $fields) {
$z = $fld.FirstAttribute.Value
$z1 = $fld.Element("val").Value
}
# write output
}
}
}
}
有没有比我考虑的更好的方法来做到这一点?
【问题讨论】:
-
这取决于“更好”对你意味着什么
-
@MathiasR.Jessen - 不幸的是,“更好”并不总是意味着它所说的。我希望在这种情况下,“更好”意味着更容易。但在现实世界中,“更好”通常意味着最不臭的选项。 ;)
标签: xml powershell export-to-csv