首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何只过滤XML文件的某些元素并使用批处理文件写入另一个XML文件?

如何只过滤XML文件的某些元素并使用批处理文件写入另一个XML文件?
EN

Stack Overflow用户
提问于 2015-08-05 09:36:16
回答 1查看 1.7K关注 0票数 1

我收到了很长的xml文件,其中包含了很多行,以至于我的编辑器无法在不崩溃的情况下打开它们。我需要能够过滤xml文件,以便保留某些标记并将其写入另一个文件。换句话说,99%的内容需要删除,结果需要保存在其他地方。

父元素称为:

代码语言:javascript
复制
<TransferSatz_Wartung>

需要保留的子元素是:

代码语言:javascript
复制
<Anlage_Allgemein>

<Anlage_Erlaubnis>

<Wartung_Probenahme>

<Wartung_Allgemein>

..so脚本运行后,我希望看到以下输出:

代码语言:javascript
复制
<TransferSatz_Wartung>
<Anlage_Allgemein>
    <child node1></child node>
    <child node2></child node>
    <child node3></child node>
</Anlage_Allgemein>     
<Anlage_Erlaubnis>
    <child node1></child node>
    <child node2></child node>
    <child node3></child node>
</Anlage_Erlaubnis>     
<Wartung_Probenahme>
    <child node1></child node>
    <child node2></child node>
    <child node3></child node>
</Wartung_Probenahme>
<Wartung_Allgemein>
    <child node1></child node>
    <child node2></child node>
    <child node3></child node>
</Wartung_Allgemein>
<TransferSatz_Wartung>

下面的示例代码并不包括所有的子标记,但是显示父节点名为TransferListe,而我要提取的子节点都在其子节点中。我想要保留的第一个子节点名为Anlage_Allgemein,可以在第4行看到。这个标记中的所有节点都应该保留。

代码语言:javascript
复制
<TransferListe>
    <TransferSatz_Wartung>
        <Version>4.06</Version>
        <Anlage_Allgemein>
            <IstAktiv>1</IstAktiv>
            <AnlagenNr>415</AnlagenNr>
            <VerfahrenBRAnzBehaelter>1</VerfahrenBRAnzBehaelter>
            <Strasse>Höremer Weg</Strasse>
            <HausNr>1</HausNr>
            <Laenderkennung>D-</Laenderkennung>
            <PLZ>29690</PLZ>
            <Ort>Hörem</Ort>
            <Ortsteil/>
            <Ansprechpartner/>
            <TelefonNr/>
            <Gemarkung/>
            <Flur/>
            <Flurstueck/>
            <Rechtswert>0000000</Rechtswert>
            <Hochwert>0000000</Hochwert>
            <DatumWartungsvertrag>17.06.1996</DatumWartungsvertrag>
            <AnlageAusgelegtEW>6</AnlageAusgelegtEW>
            <GesamtgroesseVK>0.0</GesamtgroesseVK>
            <DatumNaechsteWartung>07.06.2016</DatumNaechsteWartung>
            <Breitengrad>00°  00&#39;  00,0&#39;&#39;</Breitengrad>
            <Laengengrad>00°  00&#39;  00,0&#39;&#39;</Laengengrad>
        </Anlage_Allgemein>
        <Anlage_Erlaubnis>
            <DefBundeslaenderID>9</DefBundeslaenderID>
            <DefUWBID>31</DefUWBID>
            <AZ_UWB>66.601/66-32-159-042</AZ_UWB>
            <ErlaubnisNr>159-042</ErlaubnisNr>
            <DatumEinlErlaubnis>01.01.2001</DatumEinlErlaubnis>
            <ErlBefristungErlaubnis>01.01.2001</ErlBefristungErlaubnis>
            <ErlDatumGenehmigung>01.01.2001</ErlDatumGenehmigung>
            <ErlBefristungGenehmigung>01.01.2001</ErlBefristungGenehmigung>
            <ErlDatumInbetriebnahme>01.01.2001</ErlDatumInbetriebnahme>
            <ErlDatumAbnahme>01.01.2000</ErlDatumAbnahme>
            <Wartungshaeufigkeit>1</Wartungshaeufigkeit>
            <Eigenwartung>0</Eigenwartung>
            <Wartungsvertrag>1</Wartungsvertrag>
            <ErlGefordReinigungsklasse>0</ErlGefordReinigungsklasse>
            <ErlZusReinigungsklasse>0</ErlZusReinigungsklasse>
        </Anlage_Erlaubnis>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-05 12:08:29

查看这个PowerShell脚本是否能满足您的需要。用.ps1扩展保存它。

代码语言:javascript
复制
[xml]$xml = gc XMLfile.xml
$keep = @(
    'Anlage_Allgemein',
    'Anlage_Erlaubnis',
    'Wartung_Probenahme',
    'Wartung_Allgemein'
)
$XPath = "//TransferSatz_Wartung/*[not(self::" + ($keep -join " or self::") + ")]"

$xml.SelectNodes($XPath) | %{
    $_.parentNode.removeChild($_)
}

$xml.save("output.xml")

在cmd提示符或批处理脚本中,使用以下语法运行它:

代码语言:javascript
复制
powershell ".\scriptname.ps1"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31828685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档