Я взял имена тегов из xsd-файла и также запомнил в базу данных, но не могу назначить ссылочный номер на основе родительского узла, используя php. мой XSD
sample.xsd <?xml version="1.0" encoding="ISO-8859-1" ?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="shiporder"> <xs:complexType> <xs:sequence> <xs:element name="orderperson" type="xs:string"/> <xs:element name="shipto"> <xs:complexType> <xs:sequence> <xs:element name="name" type="xs:string"/> <xs:element name="address" type="xs:string"/> <xs:element name="city" type="xs:string"/> <xs:element name="country" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="item" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="title" type="xs:string"/> <xs:element name="note" type="xs:string" minOccurs="0"/> <xs:element name="quantity" type="xs:positiveInteger"/> <xs:element name="price" type="xs:decimal"/> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> <xs:attribute name="orderid" type="xs:string" use="required"/> </xs:complexType> </xs:element> </xs:schema>
Мой PHP-код
<?php $xsdstring ="sample.xsd"; $doc = new DOMDocument(); $doc->preserveWhitespace = false; $xsdstring = $doc->load($xsdstring); $doc->loadXML(mb_convert_encoding($xsdstring, 'utf-8', mb_detect_encoding($xsdstring))); $xpath = new DOMXPath($doc); $mysql_hostname = "localhost"; // Example : localhost $mysql_user = "root"; $mysql_password = ""; $mysql_database = "sample_db"; $dbh = new PDO("mysql:dbname={$mysql_database};host={$mysql_hostname};port=3306", $mysql_user, $mysql_password); $num=1; function echoElements($indent, $elementDef) { global $doc, $xpath,$elements,$dbh,$num,$sql; $elements = $indent . $elementDef->getAttribute('name') ."\n"; $elementDefs = $xpath->evaluate("xs:complexType/xs:sequence/xs:element", $elementDef); $sql = $dbh->prepare("INSERT INTO `test` (`name`,ref_num) VALUES (?,?)"); $sql->execute(array($elements ,$num)); foreach($elementDefs as $elementDef) { $test=echoElements("" , $elementDef); } } $elementDefs = $xpath->evaluate("/xs:schema/xs:element"); foreach($elementDefs as $elementDef) { echoElements("", $elementDef); } ?>
я ожидаю
id name ref_num 1 shiporder 0 //refers that it is root node 2 orderperson 1 //refers the id of its parent node(shiporder) 3 shipto 1 //refers the id of its parent node(shiporder) 4 name 3 //refers the id of its parent node(shipto) 5 address 3 .....
Есть ли идея создать мою таблицу в этом формате динамически?
Помоги мне решить это.
Заранее спасибо.
Вы можете попытаться поместить имена родительских узлов элемента в другое поле таблицы как parent_name
id name parent_name ref_num 1 shiporder root 0 2 orderperson shiporder 1 3 shipto shiporder 1 4 name shipto 3 5 address shipto 3 .....
И тогда вы можете вставить ref_num, используя запрос, как указано в следующей ссылке
Столбец обновления MySQL из другого столбца в одной таблице
Попробуйте добавить корневые, дочерние элементы, дочерние элементы в массиве. Искать дочерние элементы до количества дочерних элементов. вернуть массив в MYSQL
Попробуйте использовать следующий код, чтобы получить родительский узел каждого элемента и опубликовать его в базе данных
$elements = $indent . $elementDef->getAttribute('name') ."\n"; $parent = $elements->xpath("parent::*"); // or $elements->xpath( '..' ); $elementDefs = $xpath->evaluate("xs:complexType/xs:sequence/xs:element", $elementDef); $sql = $dbh->prepare("INSERT INTO `test` (`name`,ref_num,`parent_node`) VALUES (?,?,?)"); $sql->execute(array($elements,$num,$parent));