首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在powershell中解析xml

在powershell中解析xml
EN

Stack Overflow用户
提问于 2009-11-12 16:09:14
回答 4查看 29.6K关注 0票数 19

我有以下xml:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<sections>
  <section name="Options">
    <item key="HLVersionControlWebServiceURL" value="http://www.personec.no/webservices/HLVersionControl/HLVersionControl.asmx" />
    <item key="AltinnWebServiceURL" value="https://www.altinn.no/webservices/DataExchange.asmx" />
    <item key="WorkDir" value="F:\Altinn\Work\" />
    <item key="CatalogDir" value="F:\Altinn\Work\" />
  </section>
  <section name="Users">
    <item key="1" value="Admin" name="Administrator" fNr="" password="" entsystype="1" entsysid="180967" entsyspassword="" lastLogin="20091111161516" allowra0500="1" allowrf1037="1" allowra01821="1" allowra01822="0" allowrf1015="1" altinnuserpassword="/qwHHYwYinE=" />
  </section>
  <section name="SchemaTypes">
    <item key="RF1037" displayname="Terminoppgave" inputdir="F:\Altinn\Work\" validationschema=".\melding-669-8570.xsd" isSubForm="0" isSignable="0" />
    <item key="RA0500" displayname="SSB Lønnsstatistikk" inputdir="C:\Program Files (x86)\Personec\Altinn Monitor\Work\" validationschema=".\melding-868-7612.xsd" isSubForm="0" isSignable="0" />
    <item key="RA01821" displayname="SSB Fraværsstatistikk bedrift" inputdir="C:\Program Files (x86)\Personec\Altinn Monitor\Work\" validationschema=".\melding-862-6190.xsd" isSubForm="0" isSignable="0" />
    <item key="RF1015" displayname="Årsoppgave m/ LTO" inputdir="C:\Program Files (x86)\Personec\Altinn Monitor\Work\" validationschema=".\melding-210-7928.xsd" orid="210" orversion="7928" isSubForm="0" isSignable="1" />
    <item key="RF1015U" displayname="" inputdir="" validationschema=".\melding-1083-7930.xsd" orid="1083" orversion="7930" isSubForm="1" isSignable="1" />
  </section>
</sections>

并且我需要在Powershell中更改项密钥WorkDir。在使用“常规”xml-read时,我可以访问顶部部分(选项、用户等),但不能访问每个节点中的“项目键”节点。如何在powershell中编辑WorkDir的值?(我意识到我可以使用脏的字符串替换,但我更愿意“正确”地做它。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-11-13 10:12:03

这个版本使用了更多的PowerShell,并处理带有WorkDir键的多个项的情况:

代码语言:javascript
复制
$xml = [xml](Get-Content foo.xml)
$xpath = "/sections/section/item[@key='WorkDir']" 
Microsoft.PowerShell.Utility\Select-Xml $xml -XPath $xpath |
    Foreach {$_.Node.SetAttribute('value', $pwd)}
$xml.Save("$pwd\bar.xml")

请注意,如果安装了PowerShell Community Extensions,则可以使用Format-Xml cmdlet格式化输出并通过Out-File保存输出,例如:

代码语言:javascript
复制
$xml | Format-Xml -AttributesOnNewLine | Out-File bar.xml -enc utf8

OTOH $xml.Save()更简单,除了您必须记住,如果您只指定文件名,它可能没有正确的当前目录。这就是我在第一个例子中使用"$pwd\bar.xml“的原因。对于像Out-File这样的PowerShell cmdlet,这不是问题。

票数 13
EN

Stack Overflow用户

发布于 2009-11-12 17:22:06

你可以试试这个

代码语言:javascript
复制
$xmlFile = "d:\sample.xml"

[xml]$doc = Get-Content $xmlFile
$node = $doc.SelectSingleNode("/sections/section/item[@key='WorkDir']")
$node.Value = "New-Value"
$doc.Save($xmlFile)

您仍将使用一些.Net类和一个XPath查询来选择节点。

票数 11
EN

Stack Overflow用户

发布于 2009-11-12 17:11:34

您可以将XML从PowerShell加载到LINQ XDocument类中,如下所示:

代码语言:javascript
复制
[Reflection.Assembly]::LoadWithpartialName("System.Xml.Linq") | Out-Null
$xDoc = [System.Xml.Linq.XDocument]::Parse($myXmlString)

在那里,您可以使用常用的LINQ to XML方法替换this example中的属性。如果您愿意,也可以以类似的方式使用较旧的XmlDocument类。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1720673

复制
相关文章

相似问题

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