PHP xpath查询中的空间(新的SimpleXMLElement)

时间:2018-11-30 19:28:17

标签: php xml xpath

我收到XML输出,并使用新的SimpleXMLElement对其进行转换。 输出是一个数组。所以XML元素是$ xml。

Sub Comment_on_Long_Sentences()
    Dim doc As word.Document, rng As word.Range, para As word.Paragraph
    Dim i As Long

    Set doc = ActiveDocument
    For Each para In doc.Paragraphs
        Debug.Print para.Range.Sentences.Count
        For i = 1 To para.Range.Sentences.Count
            Set rng = para.Range.Sentences(i)
            If i = 1 And rng.Characters.First.Font.Superscript = True Then
                rng.MoveStart word.WdUnits.wdSentence, Count:=-1
            End If
            If rng.words.Count > 30 Then
                doc.Comments.Add Range:=rng, Text:="Long Sentence: " & rng.words.Count & " words"
            End If
        Next
    Next
End Sub

在第二个[categories_name]中,该值在字符串中有一个空格。由于空间有限,出了点问题。我没有得到任何返回的信息,如果我删除具有另一个没有空格的现有值的值,则会得到我想要的信息。

我该怎么办?

1 个答案:

答案 0 :(得分:0)

将问题简化为一个可重现的小例子:

String compare: 
string(7) "A Title"

输出:

normalize-space()

第二本书的标题包含前后的空格,因此简单的字符串比较将不匹配它。解决该问题的一种方法是使用echo "\nwith normalize-space():\n"; foreach ($books->xpath('//book[normalize-space(title)="A Title"]') as $book) { var_dump((string)$book->title); } 。此Xpath函数将用单个空格替换任何空白序列,并删除之前/之后的空白。它的作用很小,但在大多数情况下并不重要。

with normalize-space(): 
string(7) "A Title" 
string(11) " A Title "

输出:

A      Title

现在,它与两个标题都匹配,但也与trim()之类的东西匹配。

另一种解决方案可让您进行更多控制,但需要DOM。在DOM中,您可以注册可从XPath表达式调用的PHP函数。这可以是现有功能,也可以是您自己的功能。您可以使$document = new DOMDocument(); $document->loadXML($xml); $xpath = new DOMXpath($document); $xpath->registerNamespace("php", "http://php.net/xpath"); $xpath->registerPhpFunctions(['trim']); echo "\nCall back into PHP:\n"; $expression = '//book[php:functionString("trim", string(title)) = "A Title"]'; foreach($xpath->evaluate($expression) as $node) { var_dump($xpath->evaluate('string(title)', $node)); } 可用:

{{1}}

使用您自己的回调函数,您可以执行RegEx匹配或unicode字符串音译之类的操作。