Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/286.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/0/xml/15.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
PHP重新格式化所需的XML步骤_Php_Xml_Format - Fatal编程技术网

PHP重新格式化所需的XML步骤

PHP重新格式化所需的XML步骤,php,xml,format,Php,Xml,Format,我想自己编写代码,但我需要有人告诉我我在这里处理的是什么,并规划基本步骤,而不是实际的代码。现在,我的PHP通过http get web调用来获取文件内容。返回给我的数据是XML节点结构。医疗索赔返回,因此可能有一个索赔或200个索赔返回,但所有索赔的结构都是相同的元素,它们只是重复。我需要获取CLAIM主元素中的每个元素名称,并将这些名称水平打印在我在第二个示例输出中使用的圆点上。我只需要它水平列出这些名字一次,而不是重复。然后,我需要在元素中间的实际数据也用我的点勾画水平显示。所以,如果有1

我想自己编写代码,但我需要有人告诉我我在这里处理的是什么,并规划基本步骤,而不是实际的代码。现在,我的PHP通过http get web调用来获取文件内容。返回给我的数据是XML节点结构。医疗索赔返回,因此可能有一个索赔或200个索赔返回,但所有索赔的结构都是相同的元素,它们只是重复。我需要获取CLAIM主元素中的每个元素名称,并将这些名称水平打印在我在第二个示例输出中使用的圆点上。我只需要它水平列出这些名字一次,而不是重复。然后,我需要在元素中间的实际数据也用我的点勾画水平显示。所以,如果有100个索赔返回,我需要数据保持水平显示与我的点描绘

<CLAIM_LIST>
  <CLAIM>
    <fund_code>TTG-PMA N351</fund_code>
    <fund_name>TTG</fund_name>
    <ProviderTIN>444555666</ProviderTIN>
</CLAIM>
<CLAIM>
    <fund_code>XXX-PMA N444</fund_code>
    <fund_name>ILWU</fund_name>
    <ProviderTIN>888777666</ProviderTIN>
</CLAIM>
<CLAIM>
</CLAIM_LIST>

TURN the above into the below. I know how to do the dot delineation, and the column_names and data name elements. 


<column_names>
    fund_code·fund_name·ProviderTIN
 </column_names>

<data>
 TTG-PMA N351·TTG·44555666·XXX-PMA N444·ILWU·888777666
 </data>



0.0029
28
83
基金代码·基金名称·提供者tin·提供者名称·索赔编号·状态·dos·dos·end·ProcessDate·患者id·患者dob·患者姓名·患者姓氏·患者名·患者名·患者名·患者关系·收款人·账单金额·投保金额·支付金额·支付金额·折扣·免赔额·患者数量·dup·来源·索赔来源·原始收入imNumber·
TTG-PMA N351·TTG·111222999·20200312-209·发布·20200303·20200303·20200312·0000037725·19510915·范哈伦·埃迪·范哈伦·埃迪·参与者·提供者·8127.00·2888.80·2888.80·0.00·5238.20·0.00·0.00·0.00·0.00·安比卡布·SG·20200312-209·TTG-PMAN351·TTG·111222999·20200318-1361·发布20200303·20200303·20200318·0000037725·19510915·范哈伦·埃迪·范哈伦·埃迪·参与者·提供者·26.00·9.99·9.99·0.00·16.01·0.00·0.00·安比卡布·SG·20200318-1361·TTG-PMA N351·TTG·111222999·20200318-1362·发布20200318·10937725·范哈伦哈伦·埃迪·范·哈伦·埃迪·参与者·提供者·17.00·10.31·10.31·0.00·6.69·0.00·0.00·安比卡布·SG·20200318-1362·TTG-PMA N351·TTG·252363454·20200407-1405·发布·20200303·20200303·20200407·0000037725·19510915·范·哈伦·埃迪·范·埃迪HALEN·EDDIE·参与者·提供者·765.00·180.57·180.57·0.00·584.43·0.00·0.00·AMBICAB·SG·20200407-1405·TTG-PMA N351·TTG·472728752·20191119-3554·发布·20191021·20191021·20191120·000003725·19510915·VAN HALEN

我真的很感激你花时间在这里,杰克,并编写了你所做的代码。通过你的代码,我有很多东西要学。关于RegEx,我永远不会知道。我以前从未用过“DOM”。我的代码可能是,嗯,它是,一个黑客作业和数学,花了我一段时间来测试30个不同的索赔返回,但它总是给我正确的行计数。这是针对Cisco IVR的,因此我需要将XML保持为XML,但格式与此类似,以便Cisco可以为其处理维护字符串描述计数。没有一个会出现在终端屏幕上,因为它是100%的机器对机器,所以一直都是XML格式。列计数和行计数在IVR世界中非常重要。

首先要做的事情是:处理xml,这是一个复杂的问题。有一件事不是一个好主意,那就是使用正则表达式处理xml(或者html)。四处搜索,你会发现这几乎是一个普遍的共识

使用xml最合适的工具是xpath和xquery。不幸的是,php中的xpath支持非常糟糕,因此获得预期的输出需要进行大量的心理训练

话虽如此,既然您要求用php来做,这里有一个php的答案:

$string = <<<XML
[your xml snippet above]
XML;

//loading boilerplate
$claimsdoc = new DOMDocument();
$claimsdoc->loadXML($string);
$claimsdoc_xpath = new DOMXPath($claimsdoc);

$claims = $claimsdoc_xpath->evaluate('count(//CLAIM)'); //get the number of CLAIMs
$tags = $claimsdoc_xpath->evaluate('count(//CLAIM[1]//*)');//get the number of tags per CLAIM 

//get the column names and create the xml output
$cols = $claimsdoc_xpath->evaluate(".//CLAIM[1]//*");
$colnames = htmlspecialchars("<column_names>", ENT_QUOTES) . "\n<br>";    
for ($x = 0; $x < $tags; $x++) { 
  $result = $cols[$x];
  $colnames .= "$result->tagName";
  if ($x < $tags-1)
        $colnames.=" * ";  
 }    
$colnames .= "\n<br>" . htmlspecialchars("</column_names>", ENT_QUOTES);

//get the claim data and create the xml output
$data = htmlspecialchars("<data>", ENT_QUOTES) . "\n<br>";
for ($x = 1; $x <= $claims; $x++) { 
  $result = $claimsdoc_xpath->evaluate("concat(.//CLAIM[$x]//fund_code/text(),' * ',.//CLAIM[$x]//fund_name,' * ',.//CLAIM[$x]//ProviderTIN)");
  $data .=$result;
  if ($x < $claims)
        $data .=" * ";  
} 
$data .= "\n<br>" . htmlspecialchars("</data>", ENT_QUOTES);

echo $colnames;
echo "\n<br>";
echo $data;
$string=evaluate(/count(//索赔[1]/*))//获取每个索赔的标签数
//获取列名并创建xml输出
$cols=$claimsdoc_xpath->evaluate(“.//CLAIM[1]//*”);
$colnames=htmlspecialchars(“,ENT_引号)。“\n
”; 对于($x=0;$x<$tags;$x++){ $result=$cols[$x]; $colnames.=“$result->tagName”; 如果($x<$tags-1) $colnames.=“*”; } $colnames.=“\n
”。htmlspecialchars(“,ENT_引号); //获取索赔数据并创建xml输出 $data=htmlspecialchars(“,ENT_引号)。“\n
”; 对于($x=1;$x评估(“concat(.//CLAIM[$x]//fund_code/text(),'*',.//CLAIM[$x]//fund_name,'*',.//CLAIM[$x]//ProviderTIN)”); $data.=$result; 如果($x<$索赔) $data.=“*”; } $data.=“\n
”.htmlspecialchars(“,ENT\u引号); echo$colnames; 回声“\n
”; 回波数据;
输出:

<column_names>
fund_code * fund_name * ProviderTIN
</column_names>
<data>
TTG-PMA N351 * TTG * 444555666 * XXX-PMA N444 * ILWU * 888777666
</data>

基金代码*基金名称*提供者tin
TTG-PMA N351*TTG*44555666*XXX-PMA N444*ILWU*88877666

正如我在开始时提到的,如果您的数据集足够大,并且您必须经常这样做,那么学习xpath/xquery和使用诸如BaseX之类的xml数据库可能是值得的。

您的问题不清楚,可能太复杂了。您能编辑xml并对每个
节点和t仅使用3个子节点吗他根据编辑的xml确定了准确的预期输出?
It gives output like this:
<response>
<time>0.0029</time>
<cols>28</cols>
<rows>83</rows>
<column_names>
fund_code·fund_name·ProviderTIN·provider_name·claim_num·status·dos·dos_end·ProcessDate·patient_id·patient_dob·patient_name·patient_lastname·patient_firstname·patient_middlename·patient_relationship·Payee·AmountBilled·AmountCovered·AmountPaid·AmountCopay·Discount·Deductible·PatientAmount·dup·Source·ClaimSource·OriginalClaimNumber·
</column_names>
<data>
TTG-PMA N351·TTG·111222999··20200312-209·Issued·20200303·20200303·20200312·0000037725·19510915·VAN HALEN EDDIE·VAN HALEN·EDDIE··Participant·Provider·8127.00·2888.80·2888.80·0.00·5238.20·0.00·0.00··AMBICAB·SG·20200312-209··TTG-PMA N351·TTG·111222999··20200318-1361·Issued·20200303·20200303·20200318·0000037725·19510915·VAN HALEN EDDIE·VAN HALEN·EDDIE··Participant·Provider·26.00·9.99·9.99·0.00·16.01·0.00·0.00··AMBICAB·SG·20200318-1361··TTG-PMA N351·TTG·111222999··20200318-1362·Issued·20200303·20200303·20200318·0000037725·19510915·VAN HALEN EDDIE·VAN HALEN·EDDIE··Participant·Provider·17.00·10.31·10.31·0.00·6.69·0.00·0.00··AMBICAB·SG·20200318-1362··TTG-PMA N351·TTG·252363454··20200407-1405·Issued·20200303·20200303·20200407·0000037725·19510915·VAN HALEN EDDIE·VAN HALEN·EDDIE··Participant·Provider·765.00·180.57·180.57·0.00·584.43·0.00·0.00··AMBICAB·SG·20200407-1405··TTG-PMA N351·TTG·472728752··20191119-3554·Issued·20191021·20191021·20191120·0000037725·19510915·VAN HALEN

 
$string = <<<XML
[your xml snippet above]
XML;

//loading boilerplate
$claimsdoc = new DOMDocument();
$claimsdoc->loadXML($string);
$claimsdoc_xpath = new DOMXPath($claimsdoc);

$claims = $claimsdoc_xpath->evaluate('count(//CLAIM)'); //get the number of CLAIMs
$tags = $claimsdoc_xpath->evaluate('count(//CLAIM[1]//*)');//get the number of tags per CLAIM 

//get the column names and create the xml output
$cols = $claimsdoc_xpath->evaluate(".//CLAIM[1]//*");
$colnames = htmlspecialchars("<column_names>", ENT_QUOTES) . "\n<br>";    
for ($x = 0; $x < $tags; $x++) { 
  $result = $cols[$x];
  $colnames .= "$result->tagName";
  if ($x < $tags-1)
        $colnames.=" * ";  
 }    
$colnames .= "\n<br>" . htmlspecialchars("</column_names>", ENT_QUOTES);

//get the claim data and create the xml output
$data = htmlspecialchars("<data>", ENT_QUOTES) . "\n<br>";
for ($x = 1; $x <= $claims; $x++) { 
  $result = $claimsdoc_xpath->evaluate("concat(.//CLAIM[$x]//fund_code/text(),' * ',.//CLAIM[$x]//fund_name,' * ',.//CLAIM[$x]//ProviderTIN)");
  $data .=$result;
  if ($x < $claims)
        $data .=" * ";  
} 
$data .= "\n<br>" . htmlspecialchars("</data>", ENT_QUOTES);

echo $colnames;
echo "\n<br>";
echo $data;
<column_names>
fund_code * fund_name * ProviderTIN
</column_names>
<data>
TTG-PMA N351 * TTG * 444555666 * XXX-PMA N444 * ILWU * 888777666
</data>