我有一個從另一個程式生成的 XML 檔案,但我想附加到 XML 以便另一個程式仍然可以讀取資料。我撰寫了一個 PHP 腳本來簡化應用程式,但我無法讓它以我想要的方式作業。正如現在撰寫的那樣,我可以附加到 XML 檔案,但它只會附加到第一組元素。
<?php
$file = "RouteSymbol.xml";
if (file_exists($file)) {
$orders = simplexml_load_file($file,"SimpleXMLElement", LIBXML_NOERROR | LIBXML_ERR_NONE) or die("Error: Cannot create object");
echo "<table border='1'>";
foreach ($orders->xpath(".//HighwayRoutingData") as $routingPoints){
$tag=(string)$routingPoints->tag;
echo "<tr>";
echo "<td>".$tag."</td>";
$stringArr =array();
foreach($routingPoints->xpath(".//destinationSymbols//string") as $symbol){
$string=(string)$symbol;
$stringArr[] = $string;
}
$stringImp = implode(',', $stringArr);
echo "<td>";
echo $stringImp;
echo "</td>";
echo "<td>";
?>
<form method="POST" action="addSymbol.php">
<input type="text" name="symbol">
<?php
echo '<input type="hidden" name="location" value="'.$tag.'">';
echo '<input type="hidden" name="fileName" value="'.$file.'">';
?>
<input type="submit" name="addSymbol" value="ADD">
</form>
<?php
echo "</td>";
echo "<td>";
echo "<a href='#'>Delete</a>";
echo "</td>";
echo "</tr>";
}
echo "</table>";
}else{
echo "Invalid request!";
}
附加代碼
<?php
$fileName = "";
if (isset($_POST['addSymbol'])) {
$xml = new DomDocument();
//$fileName = $_POST['fileName'];
$xml->load('RouteSymbol.xml');
$symbol = $_POST['symbol'];
$rootTag = $xml->getElementsByTagName('destinationSymbols')->item(0);
$symbolTag = $xml->createElement("string", $symbol);
$rootTag->appendChild($symbolTag);
$xml->save($_POST['fileName']);
//echo $fileName;
header("location:trainRouting.php");
}else{
echo "Could not Load".$fileName;
}
我附加到的 XML 檔案,現在腳本似乎只想附加到@I80 目標符號。當它確實附加時,它也會附加到當前字串標簽集的右側而不是下面
<?xml version="1.0"?>
<ArrayOfHighwayRoutingData xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<HighwayRoutingData>
<tag>@I80</tag>
<destinationSymbols>
<string>SFO</string>
<string>OAK</string>
<string>EMR</string>
<string>ELC</string>
<string>RIC</string>
<string>SPB</string>
<string>HER</string><string>HER</string></destinationSymbols>
</HighwayRoutingData>
<HighwayRoutingData>
<tag>@SR24</tag>
<destinationSymbols>
<string>OAK</string>
<string>ORI</string>
<string>LFY</string>
<string>WCR</string>
</destinationSymbols>
</HighwayRoutingData>
<HighwayRoutingData>
<tag>@US101</tag>
<destinationSymbols>
<string>SFO</string>
<string>SSC</string>
<string>MIL</string>
<string>PAO</string>
</destinationSymbols>
</HighwayRoutingData>
</ArrayOfHighwayRoutingData>
如果有幫助的話,有一個代碼筆https://codepen.io/dsflyerds/pen/BawZzMx
uj5u.com熱心網友回復:
我對表單用于updateXML的方式進行了假設,因此,與其為每個表行/HighwayRoutingData節點都使用單獨的表單,不如將單個表單與使用array欄位名稱的語法結合起來就足夠了。
我假設寫入文本欄位的任何文本都destinationSymbols將根據tagXML 和 HTML 表中的分配附加到XML 中的相關節點,而不是附加到所有destinationSymbols節點。然而,修改該行為相當簡單。您會注意到沒有任何SimpleXML函式,因為我從未使用過它,因此它僅使用 DOMDocument 和 DOMXPath。
<?php
error_reporting( E_ALL );
/*
We should ONLY proceed if these POST fields
are actually set.
*/
if( $_SERVER['REQUEST_METHOD']=='POST' && isset(
$_POST['location'],
$_POST['fileName'],
$_POST['symbol']
)){
/*
Prepare filters
*/
$args=array(
'symbol' => array('filter' => FILTER_SANITIZE_ENCODED, 'flags' => FILTER_REQUIRE_ARRAY ),
'location' => array('filter' => FILTER_SANITIZE_ENCODED, 'flags' => FILTER_REQUIRE_ARRAY ),
'fileName' => FILTER_SANITIZE_ENCODED
);
/*
modify the POST array based upon the filters and
extract the values directly into variables.
*/
$_POST=filter_input_array( INPUT_POST, $args );
extract( $_POST );
/*
set options for dealing with XML.
*/
libxml_use_internal_errors( true ) ;
$dom=new DOMDocument('1.0','UTF-8');
$dom->recover=true;
$dom->formatOutput=true;
$dom->preserveWhiteSpace=false;
$dom->validateOnParse=false;
$dom->strictErrorChecking=false;
$dom->load( urldecode( $fileName ) );
$xp=new DOMXPath( $dom );
/*
Iterate through all POSTed items
*/
foreach( $symbol as $index => $code ){
/* Locate the relevant section within the XML based upon the tag */
$loc=urldecode( $location[ $index ] );
$expr=sprintf( '//HighwayRoutingData/tag[ contains( text(), "%s") ]', urldecode( $loc ) );
$col=$xp->query( $expr );
/* create the new symbol and add to the relevant `destinationSymbols` node */
if( $col && $col->length > 0 && !empty( $code ) ){
$symbol=$dom->createElement( 'string', $code );
$dest=$xp->query( 'destinationSymbols', $col->item(0)->parentNode )->item(0);
$dest->appendChild( $symbol );
}
}
/* save the XML and redirect? */
$dom->save( urldecode( $fileName ) );
}
?>
<!DOCTYPE html>
<html lang='en'>
<head>
<meta charset='utf-8' />
<title>Simple XML Processing...</title>
</head>
<body>
<!--
a single form should be OK and there is no need to repeat the
`fileName` element as this is the same for each row in the table.
-->
<form method='post'>
<table border=1 cellpadding='5px' cellspacing='2px'>
<tr>
<th>Tag</th>
<th>Strings</th>
<th colspan=3> </th>
</tr>
<?php
$file='RouteSymbol.xml';
libxml_use_internal_errors( true ) ;
/*
Load the XML file and build the HTML output
*/
$dom=new DOMDocument();
$dom->validateOnParse=false;
$dom->recover=true;
$dom->strictErrorChecking=false;
$dom->load( $file );
libxml_clear_errors();
$xp=new DOMXPath( $dom );
$col=$xp->query('//HighwayRoutingData');
if( $col && $col->length > 0 ){
foreach( $col as $node ){
/*
find the `string` values and add to an array
which we will use to build a string later.
*/
$output=array();
$strings=$xp->query( 'destinationSymbols/string', $node );
foreach( $strings as $string )$output[]=$string->nodeValue;
/*
Find the tag for this node.
*/
$tag=$xp->query('tag',$node)->item(0)->nodeValue;
/*
Generate a new HTML table row with data found in this
node of the xml.
*/
printf('
<tr>
<td>%1$s</td>
<td>%2$s</td>
<td>
<input type="text" name="symbol[]" />
<input type="hidden" name="location[]" value="%1$s" />
</td>
<td><input type="submit" value="ADD" /></td>
<td><a href="#delete">Delete</a></td>
</tr>',
$tag,
implode( ', ', $output )
);
}
}
?>
</table>
<input type='hidden' name='fileName' value='<?=$filename;?>' />
</form>
</body>
</html>
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/392434.html
