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\test74.xml"
[system.xml.XmlDocument]$打开的xml文件 = Get-Content $输入文件名
问:如何保存xml文件?
答:
$输出文件名 = "a:\pscode\test74.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:\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
----------------------------参考资料------------------------------------
https://msdn.microsoft.com/zh-cn/library/ms256177(v=vs.110).aspx
https://msdn.microsoft.com/zh-cn/library/System.Xml(v=vs.110).aspx
powershell玩转xml之20问的更多相关文章
- powershell玩转SQL SERVER所有版本
微软发布了最新的powershell for sql server 2016命令行客户端库.文章介绍了与之相关的实用方法. powershell 传教士 原创文章 2016-06-05, 2016-1 ...
- powershell玩转sqlite数据库
脚本经常需要处理文本,有时候是行列整齐文本.那么powershell脚本处理行列文本有几种方法呢?一种是excel,另外的一些是?access?sqlite? sqlite是一个很小巧的,很方便嵌入到 ...
- [c# 20问] 2.如何转换XML文件
添加System.Xml引用 使用XmlReader转换字符串 DEMO #region Parse Xml private static void ParseXml(string xmlString ...
- powershell玩转litedb数据库
powershell可以玩nosql数据库吗?答案是肯定的.只要这个数据库兼容.net,就可以很容易地被powershell使用. 发文初衷:世界上几乎没有讲powershell调用nosql的帖子, ...
- powershell玩转litedb数据库-第二版
powershell可以玩nosql数据库吗?答案是肯定的.只要这个数据库兼容.net,就可以很容易地被powershell使用. 发文初衷:世界上几乎没有讲powershell调用nosql的帖子, ...
- PowerShell 数组以及XML操作
PowerShell基础 PowerShell数组操作 将字符串拆分成数据的操作 cls #原始字符串 $str = "abc,def,ghi,mon" #数据定义 #$StrAr ...
- PowerShell并发控制-命令行参数之四问
传教士问: win下如何 获取进程命令行,及命令行参数? 传教士答: 可以用这个powershell命令(实际上是wmi查询): (get-wmiobject -query "select ...
- SQL SERVER 原来还可以这样玩 FOR XML PATH
FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些以前可能需要借助函数活存储过程来完成的工作.那么以一个实例为主 ...
- Java高质量20问
问题一:在多线程环境中使用HashMap会有什么问题?在什么情况下使用get()方法会产生无限循环? HashMap本身没有什么问题,有没有问题取决于你是如何使用它的.比如,你在一个线程里初始化了一个 ...
随机推荐
- Http报头Accept与Content-Type的区别
Http报头Accept与Content-Type的区别 1.Accept属于请求头, Content-Type属于实体头. Http报头分为通用报头,请求报头,响应报头和实体报头. 请求方的http ...
- JAVA 程序设置运行内存
1.修改jdk设置 2.如果不行则 一般安装完eclipse之后,在安装目录下你应该可以看到有一个 eclipse.ini 文件,对了,就是在这个文件里面修改 -vmargs:说明后面是VM的参数 - ...
- 转!!java反射机制
Java 反射机制 基本概念 在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法? 答案是肯定的. 这种动态获取类的信息以及动态调用对象 ...
- sizeof和strlen()的区别
二者有本质上的区别 从定义可以知道sizeof只是一个operator,而strlen()则是定义一个定义在<string.h>中的函数;所以sizeof(string)是在计算strin ...
- js解码
如代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...
- CentOS安装vim
VMware下CentOS安装成功后,默认自带vi,但vi功能没vim丰富.以下为CentOS中安装vim: 用yum产看源中的vim安装包: [xi@localhost ~]$ yum search ...
- python中的binascii
import binascii as B s = 'abcde' h = B.b2a_hex(s) # 字符串转16进制 '6162636465' h = B.hexlify(s) # 作用同上 s ...
- 史上最用心的 iOS App 上架流程
题记 麻痹起来嗨!看网上那么多的教程,依然在我心爱的爱屁屁在上架的时候遇到各种 J8 问题,最大的问题就是:Xcode 证书什么的,Provisioning Profile 什么的,Debug 什么的 ...
- 在VS2010中,引用了同一解决方案的另一个项目的dll,却不能正常调用(转)
目前发现的原因是,dll的.net 版本比我的程序的高 dll用的.net 4 而程序用的.net 4 client profile 转载源:http://www.cnblogs.com/szyic ...
- Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例
java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...