【问题标题】:Get XML element that has '#' in the name获取名称中包含“#”的 XML 元素
【发布时间】:2014-03-01 02:09:17
【问题描述】:

我有一个带有 SOAP 接口的程序。我返回的 XML 在某些元素名称中有“#”符号。我该如何解决?

这是 XML 文件的 sn-p。我已经为“ID4”和“ID5”列出了 sn-ps。 “ID3”到“ID20”有相同的元素。 sn-ps 被 Envelope 和 Body 标签包围:

<ns0:ArrayOfOption id="ID2" xsi:type="enc:Array" enc:arrayType="ns0:Option[18]">
    <item href="#ID4" />
    <item href="#ID5" />
</ns0:ArrayOfOption>   

<ns0:Option id="ID4" xsi:type="ns0:Option">
    <name xsi:type="xsd:string">lps</name>
    <value xsi:type="xsd:string">en_es,es_en</value>
</ns0:Option>

<ns0:Option id="ID5" xsi:type="ns0:Option">
    <name xsi:type="xsd:string">license.tr.tm</name>
    <value xsi:type="xsd:string">1</value>
</ns0:Option>

这是脚本的 sn-p。 :

[xml]$ex = get-content example.xml
for each ($i in $ex.Envelope.Body.Option){
    $i.name
    $i.value
    }

这是输出:

type          #text
----          ----
xsd:string    lps
ID4
xsd:string    license.tr.tm
ID5

使用提供对象及其属性的图形视图的 PowerGUI,我看到每个元素都有一个带有井号的属性名称“#text”。 两个问题: 1) 为什么#text 字段有一个'#' 符号?我与开发人员保持联系;我可以要求他们更改其源代码 (Java) 中的某些内容以将其删除吗?

2) 假设我无法移除它,我该如何绕过它?如果我想将值和名称分配给变量,我无法输入:

for each ($i in $ex.Envelope.Body.Option){
    $name = $i.name.#text
    $value = $i.value.#text
    }

有什么建议吗?

【问题讨论】:

  • # 之所以存在,是因为后面是“片段标识符”,即相对于当前文档的链接(因为# 之前的部分为空)。 # 是必需的,因为该属性具有 href 的语法。
  • 另外,您的问题还不清楚。 #text 是什么?您正在迭代 ns0:Option 标记,而 # 字符仅出现在 ArrayOfOption 标记中项目的 href 属性中,您根本没有检查。

标签: xml powershell soap


【解决方案1】:

要访问 #text 属性,请将属性名称放在引号中,例如:

$name = $i.name.'#text'
$value = $i.value.'#text'

【讨论】:

  • 我后来发现每个元素都有一个名为“innerText”的属性,它保存标志之间的文本。所以我可以输入 $i.name.innerText 代替。
猜你喜欢
  • 2010-10-13
  • 2014-04-29
  • 1970-01-01
  • 2020-05-06
  • 1970-01-01
  • 2013-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多