使用XPath选择具有不同开始和结束标记的XML块

时间:2017-02-24 12:55:36

标签: xml xpath

鉴于以下内容:

<SomeStuff stuffAttribute1="1" stuffAttribute="2">
    <SomeOtherStuff someOtherStuffAttribute="1" someOtherStuffAttribute="2">
        <SomeWeirdStuff someweirdStuffAttribute="1" someWeirdStuffAttribute="2">
        </SomeWeirdStuff>
    </SomeOtherStuff>
</SomeStuff>

如何使用Xpath选择XML块,如下所示:

<SomeStuff stuffAttribute1="1" stuffAttribute="2">
<SomeOtherStuff someOtherStuffAttribute="1" someOtherStuffAttribute="2">
    <SomeWeirdStuff someweirdStuffAttribute="1" someWeirdStuffAttribute="2">
    </SomeWeirdStuff>

换句话说,排除结束标记?

3 个答案:

答案 0 :(得分:0)

我认为不可能。在xpath中,您可以选择内容或块。

你最好的选择是获得整个区块然后运行一个简单的正则表达式来删除结尾或只选择开始......

答案 1 :(得分:0)

好的,首先你的XML无效。我为你制作了一个你可以玩的代码示例。它将始终删除最顶层父级的结束标记。所以这是代码片段:

$sample = 
    "<SomeStuff stuffAttribute1=\"1\" stuffAttribute=\"2\">
        <SomeOtherStuff someOtherStuffAttribute=\"2\">
            <SomeWeirdStuff someWeirdStuffAttribute=\"2\">
            </SomeWeirdStuff>
        </SomeOtherStuff>
    </SomeStuff>";

$dom = new DOMDocument();
$dom->loadXML($sample);
$firstDocumentElement = $dom->childNodes->item(0);
$closingTag = '</' . $firstDocumentElement->tagName . '>';

header("Content-type: text/plain");
$content = $dom->saveXML();

echo str_replace($closingTag, '', $content);
exit;

输出:

<?xml version="1.0"?>
<SomeStuff stuffAttribute1="1" stuffAttribute="2">
       <SomeOtherStuff someOtherStuffAttribute="2">
            <SomeWeirdStuff someWeirdStuffAttribute="2">
            </SomeWeirdStuff>
       </SomeOtherStuff>

干杯!

答案 2 :(得分:0)

这里有一个理解的问题。使用XPath时,可以在DOM节点上使用它。那些DOM节点是由XML解析器创建的,它解读和解释了你的xml。

DOM节点驻留在计算机内存中,它们没有XML文本。您可以想象XPath的工作原理如下(伪代码):

Node(name = "SomeStuff", attributes = {"stuffAttribute1": "1", "stuffAttribute" :"2"} childNodes = [
    Node(name = "SomeOtherStuff" attributes = {"someOtherStuffAttribute": "1", "someOtherStuffAttribute": "2"}, childNodes = [
        Node(name = "SomeWeirdStuff", attributes = {"someweirdStuffAttribute": "1", "someWeirdStuffAttribute": "2"}
    ])
])

我希望你明白这一点。

如果现在使用XML序列化程序打印出内存中的内容,您将打印出整个xml内容,包括结束标记。

如果你使用json序列化程序,你将得到没有结束标记但是关闭“}”,因为这就是json的工作原理。

如果您不想要结束标签,您可以在打印后将其删除,也可以自己打印整个标签,然后省略结束标签。