XML,使用PHP创建文件
我有一个SQL数据库,正在对其执行以下查询XML,使用PHP创建文件,php,xml,Php,Xml,我有一个SQL数据库,正在对其执行以下查询 $statistics="SELECT firstname AS 'user', count( * ) AS 'num',member_id AS ID FROM members JOIN member_photo USING ( member_id ) GROUP BY firstname "; $result= mysql_query($statisti
$statistics="SELECT firstname AS 'user', count( * ) AS 'num',member_id AS ID
FROM members
JOIN member_photo
USING ( member_id )
GROUP BY firstname ";
$result= mysql_query($statistics);
<uploader ID="13"><Name>Mun</Name><Photos_Uploaded>6</Photos_Uploaded></uploader>
<uploader ID="12"><Name>ris</Name><Photos_Uploaded>10</Photos_Uploaded></uploader>
这将检索上传者以及他们以以下格式上传的照片数量
Uploader Number of photos uploaded
mun 20
ris 10
moz 5
<uploader ID="13"><Name>Mun</Name><Photos_Uploaded>6</Photos_Uploaded></uploader>
<uploader ID="12"><Name>ris</Name><Photos_Uploaded>10</Photos_Uploaded></uploader>
我想要的是一个PHP脚本来创建XML文件。它必须实际保存在我的目录中。我使用SimpleXML来实现这一点
<uploader ID="13"><Name>Mun</Name><Photos_Uploaded>6</Photos_Uploaded></uploader>
<uploader ID="12"><Name>ris</Name><Photos_Uploaded>10</Photos_Uploaded></uploader>
我就是这么做的
$xmlDoc=loadXMLDoc("photo.xml");
$statistics="SELECT firstname AS 'user', count( * ) AS 'num',member_id AS ID
FROM members
JOIN member_photo
USING ( member_id )
GROUP BY firstname ";
$result= mysql_query($statistics);
while($row=mysql_fetch_assoc($result)) {
$uploader=$xml->addChild('uploader');
$uploader->addAttribute('ID',$row['ID']);
$uploader->addChild('Name', $row['user']);
$uploader->addChild('Photos_Uploaded', $row['num']);
$xml->asXML('photo.xml');
}
<uploader ID="13"><Name>Mun</Name><Photos_Uploaded>6</Photos_Uploaded></uploader>
<uploader ID="12"><Name>ris</Name><Photos_Uploaded>10</Photos_Uploaded></uploader>
其中photo.xml是保存xml节点的文件。它们是这种格式的
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="user.xsl"?>
<users xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="users.xsd">
<uploader ID="11"><Name>moz</Name><Photos_Uploaded>2</Photos_Uploaded> </uploader>
<uploader ID="13"><Name>Mun</Name><Photos_Uploaded>6</Photos_Uploaded></uploader>
<uploader ID="12"><Name>ris</Name><Photos_Uploaded>10</Photos_Uploaded></uploader>
</users>
<uploader ID="13"><Name>Mun</Name><Photos_Uploaded>6</Photos_Uploaded></uploader>
<uploader ID="12"><Name>ris</Name><Photos_Uploaded>10</Photos_Uploaded></uploader>
moz2
Mun6
风险10
现在假设用户“Moz”上传了一张新照片。他的照片计数器最初是2,应该改为3。XML文件应该反映这种更改,对吗?这是因为它从数据库中提取数据(还记得查询吗?),但问题出在这里
<uploader ID="11"><Name>moz</Name><Photos_Uploaded>2</Photos_Uploaded> </uploader>
<uploader ID="13"><Name>Mun</Name><Photos_Uploaded>6</Photos_Uploaded></uploader>
<uploader ID="12"><Name>ris</Name><Photos_Uploaded>10</Photos_Uploaded></uploader>
<uploader ID="13"><Name>Mun</Name><Photos_Uploaded>6</Photos_Uploaded></uploader>
<uploader ID="12"><Name>ris</Name><Photos_Uploaded>10</Photos_Uploaded></uploader>
moz2
Mun6
风险10
moz3
<uploader ID="13"><Name>Mun</Name><Photos_Uploaded>6</Photos_Uploaded></uploader>
<uploader ID="12"><Name>ris</Name><Photos_Uploaded>10</Photos_Uploaded></uploader>
Mun6
风险10
它还复制了其他节点,从而将复制创建到XML文件中
<uploader ID="13"><Name>Mun</Name><Photos_Uploaded>6</Photos_Uploaded></uploader>
<uploader ID="12"><Name>ris</Name><Photos_Uploaded>10</Photos_Uploaded></uploader>
我想到的是
<uploader ID="13"><Name>Mun</Name><Photos_Uploaded>6</Photos_Uploaded></uploader>
<uploader ID="12"><Name>ris</Name><Photos_Uploaded>10</Photos_Uploaded></uploader>
有人知道怎么做吗?使用php或javascript?那么您是在询问如何在编写/重写photo.xml文件之前“清空”它?对吗
<uploader ID="13"><Name>Mun</Name><Photos_Uploaded>6</Photos_Uploaded></uploader>
<uploader ID="12"><Name>ris</Name><Photos_Uploaded>10</Photos_Uploaded></uploader>
我不熟悉SimpleXML,所以我不知道是否有一个标志可以用于它,但您可以始终使用:
<uploader ID="13"><Name>Mun</Name><Photos_Uploaded>6</Photos_Uploaded></uploader>
<uploader ID="12"><Name>ris</Name><Photos_Uploaded>10</Photos_Uploaded></uploader>
$f = fopen("photo.xml", "w");
fclose($f);
这将:“仅为写入而打开;将文件指针放在文件开头,并将文件截断为零长度。如果文件不存在,请尝试创建它。”
<uploader ID="13"><Name>Mun</Name><Photos_Uploaded>6</Photos_Uploaded></uploader>
<uploader ID="12"><Name>ris</Name><Photos_Uploaded>10</Photos_Uploaded></uploader>
(见:)
<uploader ID="13"><Name>Mun</Name><Photos_Uploaded>6</Photos_Uploaded></uploader>
<uploader ID="12"><Name>ris</Name><Photos_Uploaded>10</Photos_Uploaded></uploader>
编辑
<uploader ID="13"><Name>Mun</Name><Photos_Uploaded>6</Photos_Uploaded></uploader>
<uploader ID="12"><Name>ris</Name><Photos_Uploaded>10</Photos_Uploaded></uploader>
仔细查看SimpleXML之后,您可能希望有两个文件,一个是要加载的xml文档模板,另一个是要保存的文件(photo.xml)。使用带有“w”标志的fopen将清除内容,但也会丢失xml结构
<uploader ID="13"><Name>Mun</Name><Photos_Uploaded>6</Photos_Uploaded></uploader>
<uploader ID="12"><Name>ris</Name><Photos_Uploaded>10</Photos_Uploaded></uploader>
所以实际上,你可能根本不需要使用fopen
<uploader ID="13"><Name>Mun</Name><Photos_Uploaded>6</Photos_Uploaded></uploader>
<uploader ID="12"><Name>ris</Name><Photos_Uploaded>10</Photos_Uploaded></uploader>
$xmlDoc=loadXMLDoc("photo_template.xml");
$statistics="SELECT firstname AS 'user', count( * ) AS 'num',member_id AS ID
FROM members
JOIN member_photo
USING ( member_id )
GROUP BY firstname ";
$result= mysql_query($statistics);
while($row=mysql_fetch_assoc($result)) {
$uploader=$xml->addChild('uploader');
$uploader->addAttribute('ID',$row['ID']);
$uploader->addChild('Name', $row['user']);
$uploader->addChild('Photos_Uploaded', $row['num']);
$xml->asXML('photo.xml');
}
其中photo_template.xml看起来像:
<uploader ID="13"><Name>Mun</Name><Photos_Uploaded>6</Photos_Uploaded></uploader>
<uploader ID="12"><Name>ris</Name><Photos_Uploaded>10</Photos_Uploaded></uploader>
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="user.xsl"?>
<users xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="users.xsd">
</users>
而photo.xml最终将看起来像:
<uploader ID="13"><Name>Mun</Name><Photos_Uploaded>6</Photos_Uploaded></uploader>
<uploader ID="12"><Name>ris</Name><Photos_Uploaded>10</Photos_Uploaded></uploader>
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="user.xsl"?>
<users xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="users.xsd">
<uploader ID="11"><Name>moz</Name><Photos_Uploaded>2</Photos_Uploaded> </uploader>
<uploader ID="13"><Name>Mun</Name><Photos_Uploaded>6</Photos_Uploaded></uploader>
<uploader ID="12"><Name>ris</Name><Photos_Uploaded>10</Photos_Uploaded></uploader>
</users>
moz2
Mun6
风险10
+1为了向其他人展示足够的示例代码以理解您的问题,您总是从数据库中获取要写入文件的完整数据集?是的,总是因为删除内容并再次写入整个新内容更容易、更简单+1表示打开标志“w”。这可能比有选择地附加新条目的xml节点条件化检查更有意义。但是打开标志“w”会删除我不想删除的xml结构。谢谢mason81。你是个救生员!