Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用XPath选择具有不同起始和结束标记的XML块_Xml_Xpath - Fatal编程技术网

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

使用XPath选择具有不同起始和结束标记的XML块,xml,xpath,Xml,Xpath,鉴于以下情况: <SomeStuff stuffAttribute1="1" stuffAttribute="2"> <SomeOtherStuff someOtherStuffAttribute="1" someOtherStuffAttribute="2"> <SomeWeirdStuff someweirdStuffAttribute="1" someWeirdStuffAttribute="2"> </So

鉴于以下情况:

<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>


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

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


最好的办法是获取整个块,然后在其上运行一个简单的正则表达式来删除结尾或仅选择开头…

好的,首先您的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;
$sample=
"
";
$dom=新的DOMDocument();
$dom->loadXML($sample);
$firstDocumentElement=$dom->childNodes->item(0);
$closingTag='';
标题(“内容类型:文本/普通”);
$content=$dom->saveXML();
echo str_replace($closingTag,,$content);
出口
输出:

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


干杯

这里有一个理解的问题。当您使用XPath时,您可以在DOM节点上使用它。这些DOM节点是由XML解析器创建的,该解析器读取并解释您的XML

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

我希望你明白我的意思

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

如果使用json序列化程序,将不会得到结束标记,而是结束“}”,因为json就是这样工作的


如果您不需要结束标记,您可以在打印后删除它们,也可以自己打印整个内容,只留下结束标记。

这不是xml的工作方式,也不是xpath的工作方式。这听起来像是XY问题。请告诉我们您实际想要完成什么,而不是您错误的解决方案。我需要获取API响应返回的XML块,并将其存储在字符串中。我想截断响应,这样我就有了一块XML,然后可以用它来构建进一步的请求。所以,使用XPath、Regex等等,我需要能够说:给我一个XML块,它以这个标记开始,以@Steerpike结束。好吧,你处理这个问题的方法完全错了。您不应该试图获取一段不完整的XML(可能是一个字符串),然后用它来构建另一个XML文档(可能是使用字符串操作)。您应该获取获得的XML,将其加载到DOM中,然后(a)通过删除和添加节点将该DOM修改为所需的结构,或者(b)创建一个新的DOM,合并从XML获得的任何数据。我建议创建一个新的问题,详细说明您实际要做的事情(并表明您正在使用Java)。@JLRishe谢谢-您所说的很有意义,我正在做您提到的所有事情,只有我在匆忙和过度工作,并且在匆忙中提出了一个措辞糟糕的问题——但我感谢你的建议,这些建议对我来说都是非常有意义的,关于正则表达式可能是什么样子的任何线索?在你的精确示例中,它看起来像:[\S\S]+(?=)在Python中。此处测试:。然而,这取决于确切的结构。括号之间的表达式称为“lookahead”,如果您想理解,请快速搜索它。根据您的数据结构,您可能需要也可能不需要使用regexp组。告诉我这是否适合你!但这只是一个陷阱,不是一个有效的XML,您无法从中创建DOMDocument对象…谢谢-我忘了用“java”标记问题,但我想我从您的解决方案中得到了想法-我将尝试一下-谢谢。
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"}
    ])
])