我使用的xml文件如下所示:
<text>
<paragraph/>
First text
<paragraph/>
Second text
</text>
<text>
<paragraph/>
Third text
<paragraph/>
Fourth text
</text>
我需要获取text元素的值,但结果应该是4行。因此每个<paragraph/>
元素都会开始新行:
1 |第一个文本
2 |第二个文字
3 |第三文
4 |第四个文字
我的代码:
$filexml = File::get('../file.xml');
$xml = simplexml_load_string($filexml);
for ($i=1; $i < count($xml->text) + 1; $i++) {
foreach ($xml->text as $text_item) {
echo $i++." | ".$text_item."<br/>";
}
}
我的结果:
1 |第一篇文字第二篇文字
2 |第三文第四篇文字
接下来我该怎么办?或者可能有不同的方法我如何才能达到预期的效果呢?
答案 0 :(得分:1)
您可以使用DOMDocument和DOMXPath。在表达式中,您可以使用text()获取文本节点。
然后你可以循环那些并检查空字符串。
items = new ArrayList<>();
items.add("strawberry");
items.add("raspberry");
答案 1 :(得分:0)
尝试改变这一点:
from selenium import webdriver
driver = webdriver.Chrome(executable_path=r'C:\path\to\chromedriver.exe')
driver.get('https://www.google.co.in')
print("Page Title is : %s" %driver.title)
driver.quit()
为此:
<text>
<paragraph/>
First text
<paragraph/>
Second text
</text>
<text>
<paragraph/>
Third text
<paragraph/>
Fourth text
</text>
答案 2 :(得分:0)
好的,这不是特别漂亮,我建议您仍然尝试使用XPath,但这里有...
<?php
$filexml = "<root>
<text>
<paragraph/>
First text
<paragraph/>
Second text
</text>
<text>
<paragraph/>
Third text
<paragraph/>
Fourth text
</text>
</root>";
$xml = simplexml_load_string($filexml);
$i=1;
foreach($xml->text as $textNode)
{
$textCounter = 1;
foreach ($textNode->paragraph as $text_item) {
echo $i++." | ".trim(explode(PHP_EOL.PHP_EOL, (string)$textNode)[$textCounter++])."<br/>";
}
}
?>
您基本上处于正确的轨道上,但您的内部循环需要再次遍历paragraph
个节点,而不是text
个节点。然后,您还需要能够在text
节点内拆分文本。如果文件确实包含了各行的所有内容,那么你就可以了,因为你可以拆分新行。如果没有(一行中的所有内容),那么这将无效。
答案 3 :(得分:0)
SimpleXML不适用于混合子节点。你需要使用DOM。您可以使用Xpath表达式来获取节点(文本也是节点)。
//text/*|//text/text()[normalize-space(.) != ""]
过滤text
元素内的任何子元素节点或任何文本节点(包括cdata节)。它将忽略仅包含空格的文本节点。
结果是您可以使用foreach迭代的节点列表。检查它是否是分隔符(paragraph
元素节点)。如果是,则输出缓冲区,否则将节点的文本内容添加到缓冲区。
$document = new DOMDocument();
$document->loadXml($xml);
$xpath = new DOMXpath($document);
$buffer = '';
$counter = 0;
foreach ($xpath->evaluate('//text/*|//text/text()[normalize-space(.) != ""]') as $node) {
if ($node instanceof DOMElement && $node->localName === 'paragraph') {
if ($buffer !== '') {
echo ++$counter, ' | ', trim($buffer), "\n";
$buffer = '';
}
} else {
$buffer .= $node->textContent;
}
}
if ($buffer !== '') {
echo ++$counter, ' | ', trim($buffer), "\n";
}
输出:
1 | First text
2 | Second text
3 | Third text
4 | Fourth text