PowerShell XML模式负载

时间:2018-07-22 06:52:38

标签: xml powershell xml-namespaces

我正在尝试使用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>

1 个答案:

答案 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)