我有一个xml文件:
<Epo>
<Doc upd="add">
<Fld name="IC"><Prg><Sen>A01B1/00 <Cmt>(1585, 779)</Cmt></Sen></Prg></Fld>
<Fld name="CC"><Prg><Sen>A01B1/00 <Cmt>(420, 54%)</Cmt>;</Sen><Sen>B25G1/102 <Cmt>(60, 8%)</Cmt>;</Sen><Sen>A01B1/02 <Cmt>(47, 6%)</Cmt></Sen></Prg></Fld></Doc>
<Doc upd="add">
<Fld name="IC"><Prg><Sen>A01B1/02 <Cmt>(3847, 1718)</Cmt></Sen></Prg></Fld>
<Fld name="CC"><Prg><Sen>A01B1/02 <Cmt>(708, 41%)</Cmt>;</Sen><Sen>A01B1/022 <Cmt>(347, 20%)</Cmt>;</Sen><Sen>A01B1/028 <Cmt>(224, 13%)</Cmt></Sen></Prg></Fld></Doc>
</Epo>
我想获取节点值,例如:A01B1 / 00(1585,779)-A01B1 / 00(420,54%); B25G1 / 102(60,8%); A01B1 / 02(47,6%)然后将其格式化为表格的列。我怎样才能做到这一点?我的代码:
<?php
$doc = new DOMDocument;
$doc->preserveWhiteSpace = false;
$doc->load('test.xml'); //IPCCPC-epoxif-201905
$xpath = new DOMXPath($doc);
$titles = $xpath->query('//Doc/Fld');
foreach ($titles as $title){
echo $title->nodeValue ."<hr>";
}
?>
我无法分离evrey节点。请帮我。
我想将其拆分以获取所有不同级别的内容,但是我认为主要问题是获取当前节点文本而没有子元素文本内容。使用DOMDocument,与DOMDocument nodeValue
相同textContent
(从手册开始)...
textContent此节点及其后代的文本内容。
仅在访问相对简单的层次结构时,使用DOMDocument并不是最容易使用的方法,并且要求您不断进行调用(在这种情况下)getElementsByTagName()
以获取所包含的元素,以下来源显示了如何使用来获取文档的每个部分这种方法
foreach ( $doc->getElementsByTagName("Doc") as $item ) {
echo "upd=".$item->getAttribute("upd").PHP_EOL;
foreach ( $item->getElementsByTagName("Fld") as $fld ) {
echo "name=".$fld->getAttribute("name").PHP_EOL;
foreach ( $fld->getElementsByTagName("Sen") as $sen ) {
echo trim($sen->firstChild->nodeValue) ." cmt = ".
$sen->getElementsByTagName("Cmt")[0]->firstChild->nodeValue.PHP_EOL;
}
}
}
但是,使用SimpleXML API可以提供更简单的解决方案。层次结构的每个级别都使用对象表示法->Doc
进行访问,因此可用于从根节点访问Doc元素,而foreach()
循环则可以解决该问题。您还可以看到仅使用元素名称($sen->Cmt
)只会给您该节点的文本内容,而不是后代的内容(尽管您必须将其转换为字符串才能从对象中获取值)...
$doc = simplexml_load_file("test.xml");
foreach ( $doc->Doc as $docElemnt ) {
echo "upd=".(string)$docElemnt['upd'].PHP_EOL;
foreach ( $docElemnt->Fld as $fld ) {
echo "name=".(string)$fld['name'].PHP_EOL;
foreach ( $fld->Prg->Sen as $sen ) {
echo trim((string)$sen)."=".trim((string)$sen->Cmt).PHP_EOL;
}
}
}
谢谢兄弟,它完美地工作。我还能再问一个问题吗,我想通过<form action>中的$ key搜索节点值,然后返回与我搜索的第一个节点相同级别的节点的值。例如:<Doc> <Fld name =“ IC”> ABC </ Fld> <Fld name =“ CC”> 123 </ Fld> </ Doc>。我怎样才能做到这一点?
如果只想选择那些
<Fld>
元素,则可以使用XPath表达式,例如$doc->xpath("//Doc/Fld[@name='CC']")