用Excel创build一个xml

我正在尝试根据由用户创build的Excel中的标题创build一个XML文件。 我想通过一个真实的例子来解释。

这是用户创build的excel格式。 这个模板有时可能会改变,这就是为什么我试图dynamic创build。

(细胞通过PIPE分离,并放置在第一行。)

SALES_ORDERS.ORDER_SLIP.NUMBER|SALES_ORDERS.ORDER_SLIP.DATE|SALES_ORDERS.ORDER_SLIP.ARP_CODE|SALES_ORDERS.ORDER_SLIP.NOTES1|SALES_ORDERS.ORDER_SLIP.TRANSACTIONS.TRANSACTION.TYPE 

这是我需要通过上面的Excel创build的XML。

 <SALES_ORDERS> <ORDER_SLIP DBOP="INS" > <NUMBER>...</NUMBER> <DATE>...</DATE> <ARP_CODE>...</ARP_CODE> <NOTES1>...</NOTES1> <TRANSACTIONS> <TRANSACTION> <TYPE>...</TYPE> ......... 

任何人都可以帮助我这个algorithm。

我很久没写C了。 我不知道这是否有帮助。 用php代码:

 $string = "SALES_ORDERS.ORDER_SLIP.NUMBER|SALES_ORDERS.ORDER_SLIP.DATE|SALES_ORDERS.ORDER_SLIP.ARP_CODE|SALES_ORDERS.ORDER_SLIP.NOTES1|SALES_ORDERS.ORDER_SLIP.TRANSACTIONS.TRANSACTION.TYPE"; // Split the string by | to an array of pathes $arr = explode('|', $string); $xml = ''; foreach ($arr as $s) { // Split a string by the point char to an array of items $path = explode('.', $s); // set the pointer to tho root of the xml array $p = &$xml; // Walk along the path foreach($path as $item) { // If this node does not exist if (!isset($p[$item])) { // if this level does not exist (item parent is not an array), make it if(!is_array($p)) $p = array(); $p[$item] = ''; } // move the pointer to this item $p = &$p[$item]; } } var_dump($xml); 

输出:

  array(1) { ["SALES_ORDERS"]=> array(1) { ["ORDER_SLIP"]=> array(5) { ["NUMBER"]=> string(0) "" ["DATE"]=> string(0) "" ["ARP_CODE"]=> string(0) "" ["NOTES1"]=> string(0) "" ["TRANSACTIONS"]=> array(1) { ["TRANSACTION"]=> array(1) { ["TYPE"]=> &string(0) "" } } } } } 

更新根据缺乏反应,在PHP中的algorithm,你不是很懂。 不得不记得C.在目前的趋势下正确:)

 #include <iostream> using namespace std; #define PATH '|' #define NODE '.' #define EOS 0 #define NULL 0 class node { private: char *name = NULL; node *next = NULL, *down = NULL; // data *void = NULL; public: node(char *word = NULL) { this->name = word; } void echoNode(node *p, int level = 0) { char *str; int i; if (!p) return; i = level * 4; while (i--) cout << ' '; cout << "<"; str = p->name; while (*str) cout << *str++; cout << ">"; if (p->down) { cout << "\n"; echoNode(p->down, level + 1); i = level * 4; while (i--) cout << ' '; } cout << "</"; str = p->name; while (*str) cout << *str++; cout << ">\n"; if (p->next) echoNode(p->next, level); } node * FindChild(char *word) { node *p = this->down; while(p) if (!strcmp(p->name, word)) break; else p = p->next; return p; } node * AddChild(char *word) { node *p = this; if(p->down) { p = p->down; while (p->next) p = p->next; p->next = new node; p = p->next; } else { p->down = new node; p = p->down; } p->name = word; return p; } }; void main() { char str[] = "SALES_ORDERS.ORDER_SLIP.NUMBER|SALES_ORDERS.ORDER_SLIP.DATE|SALES_ORDERS.ORDER_SLIP.ARP_CODE|SALES_ORDERS.ORDER_SLIP.NOTES1|SALES_ORDERS.ORDER_SLIP.TRANSACTIONS.TRANSACTION.TYPE\x0"; char *p = str; char *word; char status; node *xml = new node("root"); node *pxml, *t; do { pxml = xml; do { word = p; while (*p && *p != PATH && *p != NODE) p++; status = *p; *p++ = EOS; if (!(t = pxml->FindChild(word))) pxml = pxml->AddChild(word); else pxml = t; } while (status && status != PATH); } while (status != EOS); xml->echoNode(xml); }