powershell玩轉xml之20問node
powershell 傳教士 原創文章 2014-01-30,2015-10-27改 容許轉載,但必須保留名字和出處,不然追究法律責任web
問:xml文件編碼狀況如何?
答:爲了更好的支持多字符,xml文件都是utf8或unicode格式了,用bat處理不了了。sql
問:xml文件最基本的格式如何?
答:
<?xml version="1.0" encoding="UTF-16"?>
<根節點>
<根節點/>
如上所述,必須有,且只有一個根節點。並把這個文件保存成unicode格式。
固然utf-8也行。shell
問:xml文件都含有哪些子項目?
答:
元素(目錄)======element
屬性=========attrib
文本=========text
節點=========XmlNode
註釋
CDATA========不須要轉義的內容
【Processing Instruction】======存命令名和命令值微信
問:powershell 和 。net如何處理xml,有何優點?
答:傳統方法處理xml,是拿xml當純文本文檔來處理,即用正則來查找替換。
而xml文檔是有結構的,xml文檔這個目錄結構,。net中叫作xpath。powershell和。net用xpath靈活快速在xml文件中定位,而後讀寫內容。
這就是他們之間的最根本區別。
。net處理xml有好幾個類:
system.xml.XmlDocument, https://msdn.microsoft.com/zh-cn/library/system.xml.xmldocument(v=vs.110).aspx
System.Web.UI.WebControls.Xml, https://msdn.microsoft.com/zh-cn/library/system.web.ui.webcontrols.xml(v=vs.110).aspx
asp.net 裏好像也有xml類,具體忘了。
有興趣的能夠研究其中的異同點。asp.net
問:powershell 和 。net如何處理xml,有何優點?---------對比vbs
答:
powershell和vbs處理xml只是語法不一樣,類的調用方法相似,必定程度上能夠互相借鑑。
可是。net自己有一個很好的教程網站,msdn,能夠搜到中文的類和方法,屬性的教程。
。net類,比vbs的xmldom類強大,有異步讀寫,linq to xml,支持T-sql操做xml,固然了,不少狀況下用不到。
powershell有個xml處理命令Select-Xml,用來選擇節點,相對比較簡單。
『XPath 和 LINQ to XML 的比較』 https://msdn.microsoft.com/zh-cn/library/bb675156.aspx
『用 T-SQL 操做 XML』 https://msdn.microsoft.com/zh-cn/library/aa175790(v=sql.80).aspxdom
問:.net讀寫xml有幾種方法?
答:兩種 1 xmlreader,xmlwriter。2用dom法。這裏主要討論dom法。異步
問:如何打開xml文件?
答:
$輸入文件名 = "a:\pscode\test74.xml"
[system.xml.XmlDocument]$打開的xml文件 = Get-Content $輸入文件名網站
問:如何保存xml文件?
答:
$輸出文件名 = "a:\pscode\test74.xml"
$打開的xml文件.save($輸出文件名)ui
問:打開保存後,xml文件編碼如何?
答:跟源文件相同。即源文件是utf16,存後也是utf16。原來是utf8,存後也是utf8
問:如何選擇節點?
答:
if ($打開的xml文件.SelectSingleNode("節點名1/節點名2") -ne $null)
{
$已選擇的節點 = $打開的xml文件.SelectSingleNode("節點名1/節點名2")
}
"節點名1/節點名2[1]"--------返回節點2中,第一個元素值
"節點名1/節點名2[元素<3]"--------返回節點2中,元素小於3的全部值
"節點名1/節點名2[last()]"--------返回節點2中,最後一個元素值
"節點名1/節點名2[*]"--------返回節點中,全部元素值
"節點名1//節點名2"--------返回節點1中,任意層次,含有節點2的內容
"節點名1 | 節點名2"--------返回節點1,節點2的集合
"節點名1[@abc] "--------返回節點1中,全部帶有@abc屬性的集合
xml文檔操做,很大程度上在於選擇節點,這個節點的選擇,使用xpath語法。注意 xpath 區別大小寫
更多的xpath節點選擇語法參考,在msdn官網。
https://msdn.microsoft.com/zh-cn/library/ms256471(v=vs.110).aspx
問:如何選擇節點?
答:
powershell有個xml處理命令Select-Xml,用來選擇節點,相對比較簡單。
$值1 = (select-xml -Path $輸入文件名 -XPath "/aaa/bbb[1]/Ccc").node.最後一個節點
$值2 = (select-xml -Path $輸入文件名 -XPath "/aaa/bbbB").node.最後一個節點
https://msdn.microsoft.com/zh-cn/library/system.xml.xmlelement(v=vs.110).aspx
元素===目錄===element的經常使用方法和屬性:
屬性
HasChildNodes 獲取一個值,該值指示此節點是否有任何子節點。
ChildNodes 獲取節點的全部子節點。
InnerText 獲取或設置節點及其全部子級的串聯值
InnerXml 獲取或設置只表示此節點子級的標記。
IsEmpty 獲取或設置元素的標記格式。
OuterXml 獲取包含此節點及其全部子節點的標記。
方法
GetAttribute(String) 返回具備指定名稱的特性的值。
GetEnumerator 獲取循環訪問當前節點中子節點的枚舉
HasAttribute(String) 肯定當前節點是否具備帶有指定名稱的特性。
RemoveAttribute(String) 按名稱移除特性。
RemoveChild 移除指定的子節點。
SetAttribute(String, String) 設置具備指定名稱的特性的值。
問:請給出xml文件例子。
答:
-------------------------------------
<?xml version="1.0" encoding="utf-8"?>
<根>
<三大曬娃狂魔>
<李小璐>
<!--Comment是註釋--><![CDATA[在CDATA節中,全部的字符,包括特殊字符都不須要轉義,這樣察看和修改XML文檔都比較方便。]]><?這李是命令名 命令值?></李小璐>
<徐若瑄>text值=兒子李v寶</徐若瑄>
<范瑋琪 屬性值-出生地="美國俄亥俄州"></范瑋琪>三大曬娃狂魔中的text值=曬娃是指把孩子的照片等貼上微博,刷微信等進行炫耀。
</三大曬娃狂魔>
</根>
-------------------------------------
問:如何增,刪,改註釋?
答:
------------------------------------------
$輸入文件名 = 'a:\pscode\l例子.xml'
$輸出文件名 = 'a:\pscode\l例子2.xml'
[system.xml.XmlDocument]$打開的xml文件 = Get-Content $輸入文件名
if ($打開的xml文件.SelectSingleNode("/根/三大曬娃狂魔") -ne $null)
{
$已選擇的節點 = $打開的xml文件.SelectSingleNode("/根/三大曬娃狂魔")
}
[string]$要添加的註釋內容 = '到底誰是第四個曬娃狂魔捏?'
$null = $要添加的註釋對象 = $打開的xml文件.CreateComment($要添加的註釋內容)
$null = $已選擇的節點.AppendChild($要添加的註釋對象)
#移除指定的子節點,用RemoveChild(對象)
#編輯對象用,ReplaceChild(新,舊)
$打開的xml文件.save($輸出文件名)
-------------------------------------------
問:如何增,刪,改【CDATA】?
答:
原理同上
$null = $CDATA = $打開的xml文件.CreateCDataSection(cdata名稱)
問:如何增,刪,改【Processing Instruction】?
答:
$null = $pi = $打開的xml文件.CreateAttribute("pi名稱","pi值")
問:如何增,刪,改元素?(節點即目錄)
答:
$null = $要添加的節點對象 = $打開的xml文件.CreateElement("節點名稱")
問:如何增,刪,改屬性和值?
答:
$null = $要添加的屬性對象 = $打開的xml文件.CreateAttribute("屬性名稱")
問:如何讀取元素值?
答:2種方法,大同小異。
1
if ($打開的xml文件.SelectSingleNode("節點名") -ne $null)
{
$已選擇的節點 = $打開的xml文件.SelectSingleNode("節點名")
}
$元素值 = $已選擇的節點.元素名
2
if ($打開的xml文件.SelectSingleNode("節點名") -ne $null)
{
$元素值 = $打開的xml文件.SelectSingleNode("節點名").元素名
}
問:如何讀節點內的純文本
答:
$節點1.InnerText
問:如何讀節點內的xml文本
答:
$節點1.InnerXml
問:如何寫入元素值?
答:
if ($打開的xml文件.SelectSingleNode("節點名") -ne $null)
{
$打開的xml文件.SelectSingleNode("節點名").元素名 = $元素值
}
powershell 傳教士 原創文章 容許轉載,但必須保留名字和出處,不然追究法律責任
問:如何整理xml文件的縮進?
問:我有一個大的XML文件,全部東東都在一行裏面,有幾百兆了。怎麼給加上合理的換行捏?---幾百兆?我見過最大不到10M!
答:用powershell第三方模塊pscx,http://pscx.codeplex.com/ ,中的format-xml命令。
答:打開,編輯,再保存,就自動整理了。
問:我想把對象導出到xml如何作?
答:
Get-Process | Export-Clixml -Path a:\abc.xml
問:反過來從xml導入呢?答:$aaa = Import-Clixml -Path a:\abc.xml