如何在XML文件的php DOM中读取分隔符?
我有一些XML文件,我必须在HTML中读取和转换它们 XML的格式如下所示:如何在XML文件的php DOM中读取分隔符?,php,xml,dom,tags,Php,Xml,Dom,Tags,我有一些XML文件,我必须在HTML中读取和转换它们 XML的格式如下所示: <book pages="2"> <page n="1" /> <entry> ... </entry> <entry> ... </entry> <entry> ... </entry> <page
<book pages="2">
<page n="1" />
<entry>
...
</entry>
<entry>
...
</entry>
<entry>
...
</entry>
<page n="2" />
<entry>
...
</entry>
<entry>
...
</entry>
<entry>
...
</entry>
<endpages />
</book>
...
...
...
...
...
...
如何仅从单个页面提取条目数组
提前谢谢 XSLT2.0/3.0中的Easy。首先,将XML重新组织为更合理的结构:
<xsl:template match="book">
<book>
<xsl:for-each-group select="* except endpages" group-starting-with="page">
<page n="{@n}">
<xsl:copy-of select="current-group() except self::page"/>
</page>
</xsl:for-each-group>
</book>
</xsl:template>
然后,要处理所选页面,请执行以下操作:
<xsl:param name="page-num"/>
<xsl:template match="page[@n = $page-num]">
<xsl:apply-templates/>
</xsl:template>
可以使用Saxon/C处理器从PHP运行XSLT2.0/3.0。无需深入底层DOM操作。XSLT2.0/3.0中的Easy。首先,将XML重新组织为更合理的结构:
<xsl:template match="book">
<book>
<xsl:for-each-group select="* except endpages" group-starting-with="page">
<page n="{@n}">
<xsl:copy-of select="current-group() except self::page"/>
</page>
</xsl:for-each-group>
</book>
</xsl:template>
然后,要处理所选页面,请执行以下操作:
<xsl:param name="page-num"/>
<xsl:template match="page[@n = $page-num]">
<xsl:apply-templates/>
</xsl:template>
可以使用Saxon/C处理器从PHP运行XSLT2.0/3.0。无需深入研究低级DOM操作。我建议在中使用XPath,但是,我一直在使用
后面的同级
和前面的同级
的组合来处理一些XPath表达式,但我无法让它在这种XML结构中正常工作
一种有点老套的方法是,只获取给定页码后的所有内容,并在找到下一个
或
元素时停止:
$dom = new DOMDocument("1.0", "UTF-8");
$dom->load($xmlFile);
$xp = new DOMXPath($dom);
$pageNo = 2;
$list = $xp->query("/book/page[@n='" . $pageNo . "']/following-sibling::*");
foreach ($list as $node) {
if ($node->nodeName == 'page' || $node->nodeName == 'endpages') {
break;
}
echo $node->textContent . "<br />"; // <entry /> node
}
$dom=新的DOMDocument(“1.0”、“UTF-8”);
$dom->load($xmlFile);
$xp=新的DOMXPath($dom);
$pageNo=2;
$list=$xp->query(“/book/page[@n=”“$pageNo.”“]/以下同级::*”;
foreach($作为$node列出){
如果($node->nodeName=='page'| |$node->nodeName=='endpages'){
打破
}
echo$node->textContent.“
”;//节点
}
我很确定,如果XML文件中有很多页面,并且您试图只获取第一页的元素,那么这将不会很好地执行,但就代码行而言,这是可以监督的,也许其他人对如何优化XPath表达式有一些想法。我建议在中使用XPath,为此,我一直在使用
后面的兄弟姐妹
和前面的兄弟姐妹
组合使用一些XPath表达式,但我无法让它在这种XML结构中正常工作
一种有点老套的方法是,只获取给定页码后的所有内容,并在找到下一个
或
元素时停止:
$dom = new DOMDocument("1.0", "UTF-8");
$dom->load($xmlFile);
$xp = new DOMXPath($dom);
$pageNo = 2;
$list = $xp->query("/book/page[@n='" . $pageNo . "']/following-sibling::*");
foreach ($list as $node) {
if ($node->nodeName == 'page' || $node->nodeName == 'endpages') {
break;
}
echo $node->textContent . "<br />"; // <entry /> node
}
$dom=新的DOMDocument(“1.0”、“UTF-8”);
$dom->load($xmlFile);
$xp=新的DOMXPath($dom);
$pageNo=2;
$list=$xp->query(“/book/page[@n=”“$pageNo.”“]/以下同级::*”;
foreach($作为$node列出){
如果($node->nodeName=='page'| |$node->nodeName=='endpages'){
打破
}
echo$node->textContent.“
”;//节点
}
我很确定,如果XML文件中有很多页面,并且您试图只获取第一页的元素,那么这将不会很好地执行,但就代码行而言,这是可以监督的,也许其他人对如何优化XPath表达式有一些想法。您能改变结构吗?页面中应该有条目。@chris85它们是110个文件,如果您已经有XML文件的
DOMDocument
,则需要花费太多的时间。然后,您可以使用XPath查询选择
下具有特定n=“x”
属性的所有
标记。@rickdenhaan这将非常完美,但您能举个例子吗?我还没有找到一个这样的查询,这是非常粗糙的。你能改变结构吗?页面中应该有条目。@chris85它们是110个文件,如果您已经有XML文件的DOMDocument
,则需要花费太多的时间。然后,您可以使用XPath查询选择
下具有特定n=“x”
属性的所有
标记。@rickdenhaan这将非常完美,但您能举个例子吗?我还没有找到一个这样的查询,这是相当骇人听闻的。我讨厌人们在没有给出理由的情况下否决一个答案。我可以想象,有些人可能会否决这个答案,因为他们更喜欢编写100行DOM代码,而不是20行XSLT代码。但是不喜欢这个答案并不意味着它错了。我没有投你和投你反对票的idk的票。现在我给你投了更高的票:)。无论如何,你的方法是我发现的最好的方法,我看到了这一点,但不幸的是,它需要一个带有Saxon的服务器,这对我来说是个问题,因为我没有这个服务器上的特权@迈克尔讨厌人们在没有给出理由的情况下否决答案。我可以想象,有些人可能会否决这个答案,因为他们更喜欢编写100行DOM代码,而不是20行XSLT代码。但是不喜欢这个答案并不意味着它错了。我没有投你和投你反对票的idk的票。现在我给你投了更高的票:)。无论如何,你的方法是我发现的最好的方法,我看到了这一点,但不幸的是,它需要一个带有Saxon的服务器,这对我来说是个问题,因为我没有这个服务器上的特权@MichaelAt现在这是我找到的最好的解决方案谢谢现在这是我找到的最好的解决方案谢谢