• powershell玩转xml之20问


    powershell玩转xml之20问


    powershell 传教士 原创文章 2014-01-30,2015-10-27改 允许转载,但必须保留名字和出处,否则追究法律责任


    问:xml文件编码情况如何?
    答:为了更好的支持多字符,xml文件都是utf8或unicode格式了,用bat处理不了了。


    问:xml文件最基本的格式如何?
    答:
    <?xml version="1.0" encoding="UTF-16"?> 
    <根节点>
    <根节点/>
    如上所述,必须有,且只有一个根节点。并把这个文件保存成unicode格式。
    当然utf-8也行。

    问: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类,具体忘了。
    有兴趣的可以研究其中的异同点。


    问: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).aspx


    问:.net读写xml有几种方法?
    答:两种 1 xmlreader,xmlwriter。2用dom法。这里主要讨论dom法。


    问:如何打开xml文件?
    答:
    $输入文件名 = "a:pscode est74.xml"
    [system.xml.XmlDocument]$打开的xml文件 = Get-Content $输入文件名


    问:如何保存xml文件?
    答:
    $输出文件名 = "a:pscode est74.xml"
    $打开的xml文件.save($输出文件名)


    问:打开保存后,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:pscodel例子.xml'
    $输出文件名 = 'a:pscodel例子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

  • 相关阅读:
    MIPI DIsplay Panel And Linux Driver Model【转】
    Vim|多行行尾插入【转】
    LCD之mipi DSI接口驱动调试流程【转】
    Linux中的DRM 介绍【转】
    linux DRM driver 使用示例【转】
    从零开始写设备树DTS【转】
    linux内核中的宏ffs(x)【转】
    procps工具集 ----Linux中的可用内存指的是什么?【转】
    ps命令交叉编译【转】
    交叉编译Procps-ng-3.3.11【转】
  • 原文地址:https://www.cnblogs.com/zhangyubao/p/7017263.html
Copyright © 2020-2023  润新知