在一个元素中获取XML内容并将结果与​​其他子元素分开

时间:2018-03-07 14:26:33

标签: php xml

我使用的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 |第三文第四篇文字

接下来我该怎么办?或者可能有不同的方法我如何才能达到预期的效果呢?

4 个答案:

答案 0 :(得分:1)

您可以使用DOMDocumentDOMXPath。在表达式中,您可以使用text()获取文本节点。

然后你可以循环那些并检查空字符串。

items = new ArrayList<>();
items.add("strawberry");
items.add("raspberry");

Demo

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