如何使用 ConvertTo-Xml 和 Select-Xml 加载或读取 XML 文件?
How to load or read an XML file using ConvertTo-Xml and Select-Xml?
我怎样才能完成这样的事情:
PS /home/nicholas/powershell>
PS /home/nicholas/powershell> $date=(Get-Date | ConvertTo-Xml)
PS /home/nicholas/powershell>
PS /home/nicholas/powershell> $date
xml Objects
--- -------
version="1.0" encoding="utf-8" Objects
PS /home/nicholas/powershell>
PS /home/nicholas/powershell> $date.OuterXml
<?xml version="1.0" encoding="utf-8"?><Objects><Object Type="System.DateTime">12/12/2020 2:43:46 AM</Object></Objects>
PS /home/nicholas/powershell>
而是读取文件?
如何使用 ConvertTo-Xml
load/import/read/convert 一个 xml
文件来解析 Select-Xml
使用 Xpath
?
PS /home/nicholas/powershell>
PS /home/nicholas/powershell> $xml=ConvertTo-Xml ./bookstore.xml
PS /home/nicholas/powershell>
PS /home/nicholas/powershell> $xml
xml Objects
--- -------
version="1.0" encoding="utf-8" Objects
PS /home/nicholas/powershell>
PS /home/nicholas/powershell> $xml.InnerXml
<?xml version="1.0" encoding="utf-8"?><Objects><Object Type="System.String">./bookstore.xml</Object></Objects>
PS /home/nicholas/powershell>
PS /home/nicholas/powershell> $xml.OuterXml
<?xml version="1.0" encoding="utf-8"?><Objects><Object Type="System.String">./bookstore.xml</Object></Objects>
PS /home/nicholas/powershell>
PS /home/nicholas/powershell> cat ./bookstore.xml
<?xml version="1.0"?>
<!-- A fragment of a book store inventory database -->
<bookstore xmlns:bk="urn:samples">
<book genre="novel" publicationdate="1997" bk:ISBN="1-861001-57-8">
<title>Pride And Prejudice</title>
<author>
<first-name>Jane</first-name>
<last-name>Austen</last-name>
</author>
<price>24.95</price>
</book>
<book genre="novel" publicationdate="1992" bk:ISBN="1-861002-30-1">
<title>The Handmaid's Tale</title>
<author>
<first-name>Margaret</first-name>
<last-name>Atwood</last-name>
</author>
<price>29.95</price>
</book>
<book genre="novel" publicationdate="1991" bk:ISBN="1-861001-57-6">
<title>Emma</title>
<author>
<first-name>Jane</first-name>
<last-name>Austen</last-name>
</author>
<price>19.95</price>
</book>
<book genre="novel" publicationdate="1982" bk:ISBN="1-861001-45-3">
<title>Sense and Sensibility</title>
<author>
<first-name>Jane</first-name>
<last-name>Austen</last-name>
</author>
<price>19.95</price>
</book>
</bookstore>
PS /home/nicholas/powershell>
在 REPL
控制台中创建 xml
文件按预期工作:
How to parse XML in Powershell with Select-Xml and Xpath?
正确地 在 Powershell 中读取 XML 文档是这样的:
$doc = New-Object xml
$doc.Load( (Convert-Path bookstore.xml) )
XML 可以采用多种文件编码,使用 the XmlDocument.Load
method 可确保在事先不知道编码的情况下正确读取文件。
不读取具有正确编码的文件将导致数据损坏或错误,除非是非常基本或非常幸运的情况。
由于这个原因,使用 Get-Content
并将结果字符串转换为 [xml]
的常见方法是处理 XML 的错误方法。所以不要那样做。
您可以使用 Get-Content
获得正确的结果,但这需要
- 文件编码的先验知识(例如
Get-Content bookstore.xml -Encoding UTF8
)
- 将文件编码硬编码到脚本中(这意味着如果 XML 编码 ever 意外更改,它将中断)
- 限制自己使用
Get-Content
支持的极少数文件编码(XML 支持更多)
这意味着您将自己置于必须手动思考和解决 XML 专门设计为自动为您处理的问题的位置。
使用 Get-Content
正确地做事需要很多不必要的额外工作和限制。做错事毫无意义,因为做对事很容易。
示例,加载后 $doc
如上所示。
$doc.bookstore.book
打印 <book>
个元素及其属性的列表
genre : novel
publicationdate : 1997
ISBN : 1-861001-57-8
title : Pride And Prejudice
author : author
price : 24.95
genre : novel
publicationdate : 1992
ISBN : 1-861002-30-1
title : The Handmaid's Tale
author : author
price : 29.95
genre : novel
publicationdate : 1991
ISBN : 1-861001-57-6
title : Emma
author : author
price : 19.95
genre : novel
publicationdate : 1982
ISBN : 1-861001-45-3
title : Sense and Sensibility
author : author
price : 19.95
$doc.bookstore.book | Format-Table
打印与 table
相同的内容
genre publicationdate ISBN title author price
----- --------------- ---- ----- ------ -----
novel 1997 1-861001-57-8 Pride And Prejudice author 24.95
novel 1992 1-861002-30-1 The Handmaid's Tale author 29.95
novel 1991 1-861001-57-6 Emma author 19.95
novel 1982 1-861001-45-3 Sense and Sensibility author 19.95
$doc.bookstore.book | Where-Object publicationdate -lt 1992 | Format-Table
过滤数据
genre publicationdate ISBN title author price
----- --------------- ---- ----- ------ -----
novel 1991 1-861001-57-6 Emma author 19.95
novel 1982 1-861001-45-3 Sense and Sensibility author 19.95
$doc.bookstore.book | Where-Object publicationdate -lt 1992 | Sort publicationdate | select title
仅排序并打印 <title>
字段
title
-----
Sense and Sensibility
Emma
对数据进行切片和切块的方式还有很多,就看你想做什么了。
我怎样才能完成这样的事情:
PS /home/nicholas/powershell>
PS /home/nicholas/powershell> $date=(Get-Date | ConvertTo-Xml)
PS /home/nicholas/powershell>
PS /home/nicholas/powershell> $date
xml Objects
--- -------
version="1.0" encoding="utf-8" Objects
PS /home/nicholas/powershell>
PS /home/nicholas/powershell> $date.OuterXml
<?xml version="1.0" encoding="utf-8"?><Objects><Object Type="System.DateTime">12/12/2020 2:43:46 AM</Object></Objects>
PS /home/nicholas/powershell>
而是读取文件?
如何使用 ConvertTo-Xml
load/import/read/convert 一个 xml
文件来解析 Select-Xml
使用 Xpath
?
PS /home/nicholas/powershell>
PS /home/nicholas/powershell> $xml=ConvertTo-Xml ./bookstore.xml
PS /home/nicholas/powershell>
PS /home/nicholas/powershell> $xml
xml Objects
--- -------
version="1.0" encoding="utf-8" Objects
PS /home/nicholas/powershell>
PS /home/nicholas/powershell> $xml.InnerXml
<?xml version="1.0" encoding="utf-8"?><Objects><Object Type="System.String">./bookstore.xml</Object></Objects>
PS /home/nicholas/powershell>
PS /home/nicholas/powershell> $xml.OuterXml
<?xml version="1.0" encoding="utf-8"?><Objects><Object Type="System.String">./bookstore.xml</Object></Objects>
PS /home/nicholas/powershell>
PS /home/nicholas/powershell> cat ./bookstore.xml
<?xml version="1.0"?>
<!-- A fragment of a book store inventory database -->
<bookstore xmlns:bk="urn:samples">
<book genre="novel" publicationdate="1997" bk:ISBN="1-861001-57-8">
<title>Pride And Prejudice</title>
<author>
<first-name>Jane</first-name>
<last-name>Austen</last-name>
</author>
<price>24.95</price>
</book>
<book genre="novel" publicationdate="1992" bk:ISBN="1-861002-30-1">
<title>The Handmaid's Tale</title>
<author>
<first-name>Margaret</first-name>
<last-name>Atwood</last-name>
</author>
<price>29.95</price>
</book>
<book genre="novel" publicationdate="1991" bk:ISBN="1-861001-57-6">
<title>Emma</title>
<author>
<first-name>Jane</first-name>
<last-name>Austen</last-name>
</author>
<price>19.95</price>
</book>
<book genre="novel" publicationdate="1982" bk:ISBN="1-861001-45-3">
<title>Sense and Sensibility</title>
<author>
<first-name>Jane</first-name>
<last-name>Austen</last-name>
</author>
<price>19.95</price>
</book>
</bookstore>
PS /home/nicholas/powershell>
在 REPL
控制台中创建 xml
文件按预期工作:
How to parse XML in Powershell with Select-Xml and Xpath?
正确地 在 Powershell 中读取 XML 文档是这样的:
$doc = New-Object xml
$doc.Load( (Convert-Path bookstore.xml) )
XML 可以采用多种文件编码,使用 the XmlDocument.Load
method 可确保在事先不知道编码的情况下正确读取文件。
不读取具有正确编码的文件将导致数据损坏或错误,除非是非常基本或非常幸运的情况。
由于这个原因,使用 Get-Content
并将结果字符串转换为 [xml]
的常见方法是处理 XML 的错误方法。所以不要那样做。
您可以使用 Get-Content
获得正确的结果,但这需要
- 文件编码的先验知识(例如
Get-Content bookstore.xml -Encoding UTF8
) - 将文件编码硬编码到脚本中(这意味着如果 XML 编码 ever 意外更改,它将中断)
- 限制自己使用
Get-Content
支持的极少数文件编码(XML 支持更多)
这意味着您将自己置于必须手动思考和解决 XML 专门设计为自动为您处理的问题的位置。
使用 Get-Content
正确地做事需要很多不必要的额外工作和限制。做错事毫无意义,因为做对事很容易。
示例,加载后 $doc
如上所示。
$doc.bookstore.book
打印 <book>
个元素及其属性的列表
genre : novel
publicationdate : 1997
ISBN : 1-861001-57-8
title : Pride And Prejudice
author : author
price : 24.95
genre : novel
publicationdate : 1992
ISBN : 1-861002-30-1
title : The Handmaid's Tale
author : author
price : 29.95
genre : novel
publicationdate : 1991
ISBN : 1-861001-57-6
title : Emma
author : author
price : 19.95
genre : novel
publicationdate : 1982
ISBN : 1-861001-45-3
title : Sense and Sensibility
author : author
price : 19.95
$doc.bookstore.book | Format-Table
打印与 table
相同的内容genre publicationdate ISBN title author price
----- --------------- ---- ----- ------ -----
novel 1997 1-861001-57-8 Pride And Prejudice author 24.95
novel 1992 1-861002-30-1 The Handmaid's Tale author 29.95
novel 1991 1-861001-57-6 Emma author 19.95
novel 1982 1-861001-45-3 Sense and Sensibility author 19.95
$doc.bookstore.book | Where-Object publicationdate -lt 1992 | Format-Table
过滤数据
genre publicationdate ISBN title author price
----- --------------- ---- ----- ------ -----
novel 1991 1-861001-57-6 Emma author 19.95
novel 1982 1-861001-45-3 Sense and Sensibility author 19.95
$doc.bookstore.book | Where-Object publicationdate -lt 1992 | Sort publicationdate | select title
仅排序并打印 <title>
字段
title
-----
Sense and Sensibility
Emma
对数据进行切片和切块的方式还有很多,就看你想做什么了。