【问题标题】:Parsing XML File - Powershell解析 XML 文件 - Powershell
【发布时间】:2020-10-22 20:30:36
【问题描述】:

我需要从 xml 文件中的特定节点(xml 文件的第一个节点之一)读取一个值,但是当我使用这种方法打开 xml 文件时:

$xml = [xml](Get-Content $file)

...当有一个未关闭的标签时(即使在我的节点之后),我会收到这种类型的错误:

Cannot convert value "System.Object []" to type "System.Xml.XmlDocument". Error: "The 'DatiRie Summary' start tag on line
83 position 5 does not match the end tag of 'DatiBeniServizi'. Line 84, position 5. ". 

现在,我想抑制这种类型的错误并始终在我的标签中读取我的值,即使 xml 文件中有未关闭的标签(在我需要的节点之前或之后)。我希望我已经清楚了,对于打扰您,我深表歉意。

非常感谢, 安德鲁

【问题讨论】:

  • 试试$xml = [xml] (Get-Content $file -Raw)-Raw 开关忽略换行符并在一个字符串中返回文件的全部内容并保留换行符。
  • 您好,感谢您的帮助,但使用 -Raw 选项时问题再次存在。 -Raw 选项将所有 xml 数据插入到变量中。我只需要始终从特定节点获取标记中的值。我需要引入 xml 结构。你有什么建议吗?

标签: xml powershell parsing


【解决方案1】:

当您使用 XML 类型帮助程序(即[xml] ...)时,它会验证 xml 以确保在您访问内容之前它的格式正确,但从错误消息看来,您有一些不匹配的标签 -例如:

$text = @(
    "<DatiRie_Summary>",
    "    <node>text</node>",
    "</DatiBeniServizi>"
)

$xml = [xml] $text

哪个输出

Cannot convert value "System.Object[]" to type "System.Xml.XmlDocument". Error: "The 'DatiRie_Summary' start tag on line 1 position 2 does not match the end tag of 'DatiBeniServizi'. Line 3, position 3."
At line:1 char:1
+ $xml = [xml] $text
+ ~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvalidCastToXmlDocument

解决此问题的最佳方法是修复您的 xml 文件,但如果您不控制文件的生成,那么这可能是不可能的。

第二个糟糕的选择可能是改用XmlReader 类。这会“及时”验证 xml,并让您阅读到第一个格式错误的元素。但是,要使用它还有很多工作要做,所以这种权衡可能不值得,而且你仍然最终还是遇到了同样的异常......

$text = @"
<DatiRie_Summary>
   <node>mytext</node>
</DatiBeniServizi>
"@

$xmlReader = [System.Xml.XmlReader]::Create((new-object System.IO.StringReader($xmlText)));
while( $xmlReader.Read() )
{
   write-host ($xmlReader.NodeType.ToString() + ": '" + $xmlReader.Name + "' = '" + $xmlReader.Value + "'")
}

输出

Element: 'DatiRie_Summary' = ''
Whitespace: '' = '
   '
Element: 'node' = ''
Text: '' = 'text'
EndElement: 'node' = ''
Whitespace: '' = '
'
Exception calling "Read" with "0" argument(s): "The 'DatiRie_Summary' start tag on line 1 position 2 does not match the end tag of
'DatiBeniServizi'. Line 3, position 3."
At line:1 char:8
+ while( $xmlReader.Read() )
+        ~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : XmlException

【讨论】:

    猜你喜欢
    • 2021-01-02
    • 2020-12-30
    • 2016-04-20
    • 2012-07-14
    • 2013-08-04
    • 2010-12-15
    • 2020-12-30
    • 1970-01-01
    相关资源
    最近更新 更多