如何通过 Powershell 将 XML-Data 读入数据表并通过给定的 XmlSchema 强制使用正确的类型?

How to read XML-Data into a dataTable via Powershell and force using correc types via a given XmlSchema?

我目前正在努力通过强制执行给定的 XmlSchema 将 XML 数据读入数据表。 无论我做什么,在数据导入之后,所有类型都设置回“字符串”。 我需要强制以下 ID 列为“int”类型(不是“string”或“byte”):

$schema = '
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:group name="r">
    <xs:sequence>
      <xs:element name="id" type="xs:int" />
      <xs:element name="name" type="xs:string" />
    </xs:sequence>
  </xs:group>
  <xs:complexType name="body">
    <xs:group ref="r" />
  </xs:complexType>
</xs:schema>'

$data = '
<body>
    <r>
        <id>9</id>
        <name>AAA</name>
    </r>
    <r>
        <id>10</id>
        <name>BBB</name>
    </r>
</body>'

# read the schema:
$set = [System.Data.Dataset]::new()
$sr =[System.IO.StringReader]::new($schema)
$set.ReadXmlSchema($sr)

# read the data:
$sr =[System.IO.StringReader]::new($data)
$set.ReadXml($sr)

cls
$set.Tables | ft -AutoSize
write-host "type of column 'id' in table : " $set.Tables[0].Columns[0].DataType

$list = [System.Collections.ArrayList]::new($set.Tables[0].GetList())
write-host "type of column 'id' in list  : " $list[0].id.GetType()

我也用 XMLReadMode 做了一些测试,但是唯一的变化出现了,当我使用 [System.Data.XmlReadMode]::InferTypedSchema 时,这会根据数据将类型更改为“字节”或其他类型对于该列。

在此欢迎任何帮助! 提前谢谢你。

多亏了提示我终于解决了。 首先我发现,我不需要在数据导入之前创建专用的 XMLSchema - 只需创建适当的 table-结构就可以用更少的代码完成同样的事情。

这里是最终代码示例:

cls
$set =[System.Data.DataSet]::new()
$set.tables.Add('r')
$table = $set.Tables[0]
[void]$table.Columns.Add('id', [int])
[void]$table.Columns.Add('name', [string])

$data = '
<body>
    <r>
        <id>9</id>
        <name>AAA</name>
    </r>
    <r>
        <id>10</id>
        <name>BBB</name>
    </r>
</body>'

# read the data:
$sr =[System.IO.StringReader]::new($data)
[void]$set.ReadXml($sr)

$set.Tables | ft -AutoSize
write-host "type of column 'id' in table : "   $table.Columns['id'].DataType

$list = [System.Collections.ArrayList]::new($table.GetList())
write-host "type of column 'id' in list  : " $list[0].id.GetType()

这里是上面脚本的输出:

id name
-- ----
 9 AAA 
10 BBB 


type of column 'id' in table :  System.Int32
type of column 'id' in list  :  System.Int32