【问题标题】:Select a xml node with specific xmlText and attribute value in coldfusion在coldfusion中选择具有特定xmlText和属性值的xml节点
【发布时间】:2015-02-20 00:05:39
【问题描述】:

我有一个 XML 文档,这是我要选择的节点:

最初我尝试使用其属性 ID 选择它,它工作正常:

<cfset local.XML = xmlParse(filePath)>       
<cfset local.header = xmlSearch(
                local.XML,
                "/FILE/COLUMNS/HEADER[@ID = 1051]"
            )> 

我现在正在尝试选择这个 xml 节点,其 xmlText 为:

<cfset local.header = xmlSearch(
                local.XML,
                "/FILE/COLUMNS/HEADER[text() = '4079']"
            )>

但我无法选择该节点及其文本。 我究竟做错了什么? 是否可以在单个语句中选择具有特定属性值和文本的节点? 这是示例 XML:

<?xml version="1.0" encoding="UTF-8"?>
<FILE>
    <COLUMNS ID="1" xmlns="">
        <HEADER ID="1134">
            <![CDATA[11222]]>
        </HEADER>
        <HEADER ID="1135">
            <![CDATA[Test Data]]>
        </HEADER>
        <HEADER ID="1136">
            <![CDATA[Test Data]]>
        </HEADER>
        <HEADER ID="1151">
            <![CDATA[4079]]>
        </HEADER>
        <HEADER ID="1137">
            <![CDATA[Test Data]]>
        </HEADER>
        <HEADER ID="1144">
            <![CDATA[Test Data]]>
        </HEADER>
    </COLUMNS>
    <COLUMNS ID="2" xmlns="">
        <HEADER ID="1134">
            <![CDATA[11222]]>
        </HEADER>
        <HEADER ID="1135">
            <![CDATA[Test Data]]>
        </HEADER>
        <HEADER ID="1136">
            <![CDATA[Test Data]]>
        </HEADER>
        <HEADER ID="1151">
            <![CDATA[4079]]>
        </HEADER>
        <HEADER ID="1137">
            <![CDATA[4079]]>
        </HEADER>
        <HEADER ID="1144">
            <![CDATA[4079]]>
        </HEADER>
    </COLUMNS>
</FILE>

现在我想用xmlText = 4079 选择所有HEADER 节点。 请帮忙。提前致谢。

【问题讨论】:

  • 您能否提供示例 XML 以及您尝试解析的测试数据?
  • @abbottmw 我已经编辑了我的问题并添加了 XML 示例。

标签: xml coldfusion xml-parsing


【解决方案1】:

您可以尝试使用 normalize-space() 以及您拥有的 XMLSearch。

<cfset search = XMLSearch(xmlobj,"//HEADER[@ID=1151][normalize-space(text())='4079']")/>

我在搜索中包含了 ID 属性和文本值。

这应该会为您提供值为 4079 和 ID 为 1151 的 HEADER 项。在您的示例 XML 中有两个,因此如果您也想要一个唯一值(如按列过滤),您可能需要做更多的事情。

normalize-space() 会从左右两边剪掉空格并返回字符串值。

【讨论】:

  • 我还找到了另一种方法,虽然不太可行但可以使用,即//HEADER[@ID=1151][ contains(text() , '4079') ]
  • 如果你使用 contains() 它将找到文本中任何位置存在 4079 的节点,因此请注意这一点。
  • 是的,我明白这一点。这就是为什么我说不是可行的方法。
【解决方案2】:

如果没有要测试的 XML 示例,这很难说,但我认为您只是缺少了一个斜杠(“/”),例如:

<cfset local.header = xmlSearch(
            local.XML,
            "/FILE/COLUMNS/HEADER/[text() = '4079']"
        )>

【讨论】:

  • 如果我将在 HEADER 之后添加“/”,那么它将选择哪个节点?我试过这个,但我得到了错误。我不认为这是错误。但是感谢您的回复:)
  • 搜索 text() 时不需要最后一个 /。不看 XML 就很难判断,但你能试试“//header[text()=4079]”看看返回什么吗?
  • @abbottmw 当我使用这个 xmlPath /FILE/COLUMNS/HEADER[text() = '4079'] 时,我得到的是空数组,当我使用 andrewdixon 建议的 xmlPath 时,我得到了错误,我认为这很明显,因为我必须指定什么选择哪些有text() = '4079',即/FILE/COLUMNS/*[text() = '4079']
猜你喜欢
  • 2021-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-30
  • 2023-04-03
  • 1970-01-01
  • 2013-04-26
  • 1970-01-01
相关资源
最近更新 更多