我正在尝试使用PowerShell获取XML内容,然后将其写入可以上传到SQL Server的文本文件中。我尝试过的一切都失败了,而且我发现PowerShell中的XML有点令人沮丧。
这是我的基本尝试(显示了缩短的路径):
$xmlpath = 'C:\...\GetCourses\Data\GetCourses.xml'
$xsdpath = 'C:\...\GetCourses\Schema\GetCourses.xsd'
$txtpath = 'C:\...\GetCourses\Csv\GetCourses.txt'
[xml]$xmldata = Get-Content $xmlpath
#This is the only thing that gets me anything
$xmldata.GetElementsByTagName("int")
#This does not work
$xmldata.GetCoursesResult.int | Out-File $txtpath -Encoding ascii
这是我从Visual Studio中的XML文件创建的架构文件的样子:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:tns="http://www.kmionline.com/elms" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.kmionline.com/elms" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="GetCoursesResponse">
<xs:complexType>
<xs:sequence>
<xs:element name="GetCoursesResult">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="int" type="xs:unsignedInt" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
如果我手动格式化和简化XML文件,使其看起来像没有所有名称空间,版本,编码等的XML,那么它就可以正常工作。但是我不能对我生成的每个文件都这样做。我在网上找不到任何有效的方法。请提供任何建议或帮助。
这是截短的返回响应,其格式设置为易于阅读。
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<GetCoursesResponse xmlns="http://www.kmionline.com/elms">
<GetCoursesResult>
<int>109</int>
<int>1000000375</int>
.
.
.
<int>1000013568</int>
</GetCoursesResult>
</GetCoursesResponse>
</soap:Body>
</soap:Envelope>
答案 0 :(得分:0)
使用点访问的优点是您不必处理名称空间管理。但是,您不能忽略中间节点。要通过点访问从XML示例中获取<int>
节点的值,您需要执行以下操作:
$xmldata.Envelope.Body.GetCoursesResponse.GetCoursesResult.int
如果要使用适当的XML选择方法(可提供更大的灵活性),则需要使用名称空间管理器来处理名称空间:
$nm = New-Object Xml.XmlNamespaceManager $xmldata.NameTable
$nm.AddNamespace('ns', 'http://www.kmionline.com/elms')
$xmldata.SelectNodes('//ns:int', $nm)