我正在尝试将我的模型更改为xml格式。
我做了几乎所有事情,但我仍然需要这件事:
$data = [
'domain'=> $xmlDocument->domain,
'FirstDate' => $xmlDocument->dateAttribute->first_date,
'LastDate' => $xmlDocument->dateAttribute->last_date,
'Category' => $xmlDocument->category->name,
'Action' => $xmlDocument->websiteAction->name,
'Source' => $xmlDocument->source->name,
'LogFile' => $xmlDocument->log_file,
'DateAttribute' => [
'Name' => $xmlDocument->dateAttribute->name,
'Place' => $xmlDocument->dateAttribute->dateLocation->name,
'DateFunction' => $xmlDocument->dateAttribute->dateFunction->name
],
'MasterPage' => [
'MasterAttributes' => [
],
'Container'=>[
'xpath' => $xmlDocument->masterInformation->xpath
],
'NextPage' =>[],
'LinkAttribute'=>[]
],
];
如您所见,MasterAttributes
为空。
模型$xmlDocument
具有这样的一对多关系:
$xmlDocument->masterInformaton->masterAttributes
masterAttributes
是很多部分
如何使用那么多并将其传递给数组,因此该数组中的每个元素都是:
'masterAttribute' => [
'name' => ...,
'xpath' => ...
]
换句话说,我将有许多数组,这些数组将被添加到我向你展示的代码中的空 MasterAttribute键。
我希望我能指出你,如果没有,请告诉我。
我尝试过:
$masterAttributes = [];
foreach ($xmlDocument->masterInformation->masterAttributes as $attribute){
$masterAttribute = [
'Attribute' =>[
'defaultValue' => $attribute->defaultValue,
'name' => $attribute->attributeName->name,
'xpath' => $attribute->xpath
]
];
array_push($masterAttributes, $masterAttribute);
}
然后我将结果如下:
'MasterAttributes' => [
$masterAttributes
],
但生成的xml是:
<MasterAttributes>
<item0>
<item0>
<Attribute>
<defaultValue />
<name>bathroom</name>
<xpath>this is the xpath</xpath>
</Attribute>
</item0>
<item1>
<Attribute>
<defaultValue />
<name>price</name>
<xpath>new xpath</xpath>
</Attribute>
</item1>
<item2>
<Attribute>
<defaultValue />
<name>bathroom</name>
<xpath>new xpath value</xpath>
</Attribute>
</item2>
</item0>
</MasterAttributes>
看一下我不想要的额外Item2
和item0
生成xml的代码是:
$xml = new SimpleXMLElement("<?xml version=\"1.0\"?><websiteInformation></websiteInformation>");
$this->array_to_xml($data,$xml);
$xml->asXML("FileName".XmlDocument::find($id)->id.".xml");
其中$data
是我向您展示的最终数组,而array_to_xml
是:
// function defination to convert array to xml
public function array_to_xml($student_info, &$xml_student_info) {
foreach($student_info as $key => $value) {
if(is_array($value)) {
if(!is_numeric($key)){
$subnode = $xml_student_info->addChild("$key");
$this->array_to_xml($value, $subnode);
}
else{
$subnode = $xml_student_info->addChild("item$key");
$this->array_to_xml($value, $subnode);
}
}
else {
$xml_student_info->addChild("$key",htmlspecialchars("$value"));
}
}
}
@watcher
给了我一个aswer,这是他/她回答的结果
<MasterAttributes>
<item0>
<masterAttribute>
<name />
<xpath>this is the xpath</xpath>
</masterAttribute>
</item0>
<item1>
<masterAttribute>
<name />
<xpath>new xpath</xpath>
</masterAttribute>
</item1>
<item2>
<masterAttribute>
<name />
<xpath>new xpath value</xpath>
</masterAttribute>
</item2>
</MasterAttributes>
答案 0 :(得分:1)
尝试这样的事情:
$attributes = $xmlDocument->masterInformaton->masterAttributes;
foreach($attributes as $attribute) {
$data['MasterPage']['MasterAttributes'][] = [
'masterAttribute' => [
'name' => $attribute->name,
'xpath' => $attribute->xpath,
]
];
}
这假设主要属性的属性为name
和xpath
。
<强>更新强>
$subnode = $xml_student_info->addChild("item$key");
这是xml生成中添加item0
个节点的行。删除它无济于事,因为您确实需要根据这些索引构建子树,但您不希望将它们直接添加到XML文档中。
我尝试了一个快速的解决方案,但事实证明它并不那么快(我也发现我认为你找到xml代码here的原始答案)。
更新2
尝试将此用于xml生成,看看它是否能满足您的需求。它基于this answer @drzaus:
function simple_xmlify($arr, SimpleXMLElement $root = null, $el = 'x') {
// based on, among others https://stackoverflow.com/a/1397164/1037948
if(!isset($root) || null == $root) $root = new SimpleXMLElement('<' . $el . '/>');
if(is_array($arr)) {
foreach($arr as $k => $v) {
// special: attributes
if(is_string($k) && $k[0] == '@') $root->addAttribute(substr($k, 1),$v);
// normal: append
else {
if(is_numeric($k) && is_array($v)) {
foreach($v as $ik => $iv) {
simple_xmlify($iv, $root);
}
} else {
simple_xmlify($v, $root->addChild(
// fix 'invalid xml name' by prefixing numeric keys
is_numeric($k) ? 'n' . $k : $k)
);
}
}
}
} else {
$root[0] = $arr;
}
return $root;
}//-- fn simple_xmlify