2013-03-02 25 views
1

下面是兩個包含我想要以XML格式存在的數據的表。實際的東西是兩個以上隨機數的行。如何將此HTML表格轉換爲XML?

<table width="100%" align="center" class="mytable" border="1" cellspacing="1"> 
    <tr><td width="100%"><b>Δ.Ο.Υ. Α' ΑΘΗΝΩΝ (Α',Β',Γ',ΙΕ',ΚΒ') Κ.Α.: 1101</b> Αναξαγόρα 6-8, T.K. 100 10 Αθήνα</a><a name="aa8inon"></a></td></tr> 
    <tr><td width="8%">Προϊστάμενος</td><td width="8%">&nbsp;</td><td width="8%"><b>210</b>-52.72.810, 770</td></tr> 
    <tr><td width="8%">Υποδιευθυντής Φορολογίας</td><td width="8%">&nbsp;</td><td width="8%"><b>210</b>-52.72.804</td></tr> 
    <tr><td width="8%">Υποδιευθυντής Ελέγχου</td><td width="8%"><b>213</b> 1604121</td><td width="8%"><b>210</b>-52.72.807</td></tr> 
</table> 

<table width="100%" align="center" class="mytable" border="1" cellspacing="1"> 
    <tr><td width="100%"><b>Δ.Ο.Υ. ΚΑΤΟΙΚΩΝ ΕΞΩΤΕΡΙΚΟΥ Κ.Α.: 1125</b> Μετσόβου 4-T.K. 106 82 Αθήνα</td></tr> 
    <tr><td width="8%">Προϊστάμενος</td><td width="8%"><b>213</b> 1607155</td><td width="8%"><b>210</b>- 8204607</td></tr> 
    <tr><td width="8%">Υποδιευθυντής Φορολογίας</td><td width="8%">&nbsp;</td><td width="8%"><b>210</b>- 8204604</td></tr> 
</table> 

表標籤下面的第一行是根元素,所有其他行都是子元素。如果我在正確命名元素時犯了一些錯誤,請原諒我。

例如第一<tr><td>之間看到

<b>Δ.Ο.Υ. Α' ΑΘΗΝΩΝ (Α',Β',Γ',ΙΕ',ΚΒ') Κ.Α.: 1101</b> Αναξαγόρα 6-8, T.K. 100 10 Αθήνα</a><a name="aa8inon"></a> 

這將是根元素的屬性名稱。

以下行Προϊστάμενος的第一<td></td>是子元素,並從下一<td>直到<tr>最後</td>是這個子元素中的數據。

這是我想有

<note doy="<b>Δ.Ο.Υ. Α' ΑΘΗΝΩΝ (Α',Β',Γ',ΙΕ',ΚΒ') Κ.Α.: 1101</b> Αναξαγόρα 6-8, T.K. 100 10 Αθήνα</a><a name="aa8inon"></a>"> 
    <Προϊστάμενος>&nbsp;</td><td width="8%"><b>210</b>-52.72.810, 770</Προϊστάμενος> 
    <Υποδιευθυντής Φορολογίας>&nbsp;</td><td width="8%"><b>210</b>-52.72.810, 770</Υποδιευθυντής Φορολογίας> 
</note> 

什麼這可能嗎?任何代碼表示讚賞。

+1

嘗試我們解釋什麼是你想這樣做。檢查XY問題線程(http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。 – 2013-03-02 21:55:35

+0

如果你想修改外部頁面,你應該創建一個腳本來接受你想要修改的頁面URL(index.php?url = http%3A%2F%2Fwww.google.com),並且你加載頁面的HTML服務器端並將javascript添加到它。 – 2013-03-02 22:00:12

+11

您的HTML或XML都無效。另外,**你有什麼嘗試**?! – 2013-09-07 14:50:09

回答

0

我不是一個php編碼器我自己,道歉的任何錯誤。我用[1]作爲參考,並做出答案了日新月異的變化來接近你有什麼作爲你的問題:

代碼作爲一個粗略的想法:

<?php 


    # Create new DOM object 
    $domOb = new DOMDocument(); 

    # Grab your HTML file 
    $html = $domOb->loadHTMLFile(sections.html); 

    # Remove whitespace 
    $domOb->preserveWhiteSpace = false; 

    # Set the container tag 
    $container = $domOb->getElementsByTagName('table'); 

    # Loop through td values 
    foreach ($container as $row) 
    { 
     # Grab all <td> 
     $items = $row->getElementsByTagName('td'); 
    } 

?> 

進化到完全回答問題:

就這樣,幾乎直接從該來源[1]採取$container具有所有表和$items具有<td>元件CON帳篷。

我想你可以將某些PHP的,所以它不會是一個大招,現在做如下(這裏僅僅是僞代碼,對不起):

1) Take one table item from `$container` with that `foreach` 
2) Take first td item, write the needed xml tag `<note doy="` 
3) Print td content there 
4) Close tag `">` 
5) Print the rest of the rows, adding the <td> tags manually to the sides (I suppose this code removes them 
6) Add trailing `</node>` tag and iterate to next one on `$container` 

對不起,我的PHP技能等於零,嘗試用這些來管理,或者如果其他人可以改善這一點,請隨意使用我的開始作爲一個來源,並作出新的答案。我只想幫助@Kaoukkos,如果我不能給出最完整的答案和另一個人可以,我不想要任何分數。

需要的是不要用foreach,但一些其他的方式,在那裏你可以說做2-4第一行和5到其他內容和重複它就是這樣,夥計們!

我的消息來源:

[1] Generating XML from HTML list using PHP

2

回想起來,我不能告訴你的問題是爲PHP或JavaScript,但這裏是在Javascript答案。只需將其保存到HTML文件並將其加載到新的瀏覽器窗口即可查看輸出結果。

<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
</head> 
<body> 
<table width="100%" align="center" class="mytable" border="1" cellspacing="1"> 
    <tr><td width="100%"><b>Δ.Ο.Υ. Α' ΑΘΗΝΩΝ (Α',Β',Γ',ΙΕ',ΚΒ') Κ.Α.: 1101</b> Αναξαγόρα 6-8, T.K. 100 10 Αθήνα</a><a name="aa8inon"></a></td></tr> 
    <tr><td width="8%">Προϊστάμενος</td><td width="8%">&nbsp;</td><td width="8%"><b>210</b>-52.72.810, 770</td></tr> 
    <tr><td width="8%">Υποδιευθυντής Φορολογίας</td><td width="8%">&nbsp;</td><td width="8%"><b>210</b>-52.72.804</td></tr> 
    <tr><td width="8%">Υποδιευθυντής Ελέγχου</td><td width="8%"><b>213</b> 1604121</td><td width="8%"><b>210</b>-52.72.807</td></tr> 
</table> 
<table width="100%" align="center" class="mytable" border="1" cellspacing="1"> 
    <tr><td width="100%"><b>Δ.Ο.Υ. ΚΑΤΟΙΚΩΝ ΕΞΩΤΕΡΙΚΟΥ Κ.Α.: 1125</b> Μετσόβου 4-T.K. 106 82 Αθήνα</td></tr> 
    <tr><td width="8%">Προϊστάμενος</td><td width="8%"><b>213</b> 1607155</td><td width="8%"><b>210</b>- 8204607</td></tr> 
    <tr><td width="8%">Υποδιευθυντής Φορολογίας</td><td width="8%">&nbsp;</td><td width="8%"><b>210</b>- 8204604</td></tr> 
</table> 
<textarea id="output" rows="24" cols="140"></textarea> 
</body> 
<script type="text/javascript"> 
var tables=document.getElementsByTagName("table"); 
var doc, note, el, elName, txt,txtContent; 

doc=document.implementation.createDocument("AnyNamespaceYouWantForYourXML","RootElementName"); //In older versions of IE, I believe you'll have to resort to an ActiveX object 
for(var t =0; t<tables.length;t++){ 
    el=doc.createElement("note"); 
    note=doc.documentElement.appendChild(el); 
    rows=tables[t].getElementsByTagName("tr"); 
    for(var r=0; r<rows.length; r++){ 
     var tds=rows[r].getElementsByTagName("td"); 
     if(r==0){ 
      note.setAttribute("doy",tds[0].innerHTML); //Unlike in your example output, the real output will have 'special' characters correctly html encoded 
     } else { 
      elName=tds[0].innerText; 
      elName=elName.trim(); //You probably want to discard leading or trailing whitespace 
      elName=elName.replace(/[\s]+/g,"_"); //XML element names cannot contain spaces, so replace with underscores 
      //There are other rules relating to valid XML element names which you may need to add here. Greek letters should be fine. 
      el=doc.createElement(elName); 
      //It wasn't clear from your example whether you wanted the xml element to contain the text of the html or some text and a td element 
      //The first case seemed more likely, so here it is 
      txtContent=" </td>"; 
      for(var d=1;d<tds.length;d++){ 
       txtContent+=tds[d].outerHTML; 
      } 
      txt=doc.createTextNode(txtContent); 
      el.appendChild(txt); //Put the text in the element 
      note.appendChild(el); //Add the element to the note 
     } 
    } 
} 
console.log(doc); //Check the console, you have a useful XML document object 
document.getElementById("output").value=xml2Str(doc.documentElement); //Output a string representation 


function xml2Str(xmlNode) { 
    try { 
     // Pretty printing available? 
     return XML((new XMLSerializer()).serializeToString(xmlNode)).toXMLString(); 
    } 
    catch (e) {} 
    try { 
     // Gecko- and Webkit-based browsers (Firefox, Chrome), Opera. 
     return (new XMLSerializer()).serializeToString(xmlNode).replace(/<([^\/])/g,"\n<$1"); 
    } 
    catch (e) {} 
    try { 
    // Internet Explorer. 
    return xmlNode.xml.replace(/<([^\/])/g,"<\1"); 
    } 
    catch (e) {} 
    //Other browsers without XML Serializer 
    alert('Xmlserializer not supported'); 
    return false; 
} 
</script> 
</html> 

樣本輸出(壓痕手工添加):

<RootElementName xmlns="AnyNamespaceYouWantForYourXML"> 
<note doy="&lt;b&gt;Δ.Ο.Υ. Α' ΑΘΗΝΩΝ (Α',Β',Γ',ΙΕ',ΚΒ') Κ.Α.: 1101&lt;/b&gt; Αναξαγόρα 6-8, T.K. 100 10 Αθήνα&lt;a name=&quot;aa8inon&quot;&gt;&lt;/a&gt;"> 
    <Προϊστάμενος> &lt;/td&gt;&lt;td width="8%"&gt;&amp;nbsp;&lt;/td&gt;&lt;td width="8%"&gt;&lt;b&gt;210&lt;/b&gt;-52.72.810, 770&lt;/td&gt;</Προϊστάμενος> 
    <Υποδιευθυντής_Φορολογίας> &lt;/td&gt;&lt;td width="8%"&gt;&amp;nbsp;&lt;/td&gt;&lt;td width="8%"&gt;&lt;b&gt;210&lt;/b&gt;-52.72.804&lt;/td&gt;</Υποδιευθυντής_Φορολογίας> 
    <Υποδιευθυντής_Ελέγχου> &lt;/td&gt;&lt;td width="8%"&gt;&lt;b&gt;213&lt;/b&gt; 1604121&lt;/td&gt;&lt;td width="8%"&gt;&lt;b&gt;210&lt;/b&gt;-52.72.807&lt;/td&gt;</Υποδιευθυντής_Ελέγχου> 
</note> 
<note doy="&lt;b&gt;Δ.Ο.Υ. ΚΑΤΟΙΚΩΝ ΕΞΩΤΕΡΙΚΟΥ Κ.Α.: 1125&lt;/b&gt; Μετσόβου 4-T.K. 106 82 Αθήνα"> 
    <Προϊστάμενος> &lt;/td&gt;&lt;td width="8%"&gt;&lt;b&gt;213&lt;/b&gt; 1607155&lt;/td&gt;&lt;td width="8%"&gt;&lt;b&gt;210&lt;/b&gt;- 8204607&lt;/td&gt;</Προϊστάμενος> 
    <Υποδιευθυντής_Φορολογίας> &lt;/td&gt;&lt;td width="8%"&gt;&amp;nbsp;&lt;/td&gt;&lt;td width="8%"&gt;&lt;b&gt;210&lt;/b&gt;- 8204604&lt;/td&gt;</Υποδιευθυντής_Φορολογίας> 
</note> 
</RootElementName> 

[編輯]注意事項:

  1. ,它含有無與倫比的標記您的示例輸出是混淆了(例如標記在你的doy屬性和希臘名字標籤裏面)。我試着儘可能最好地解釋您的示例輸出,並將屬性內和希臘名稱元素內的所有內容都轉換爲文本。這意味着<被表示爲& lt;和「作爲&」和「作爲&」;但是,另一種可能性是圍繞標記與< [!CDATA [...]]>告訴XML解釋器不要解析該區域中的字符。您可以使用希臘字符命名XML元素,請注意,並非所有字符都是有效的或XML元素名稱,因此您必須對可以在第一個單元格中顯示的文本進行某種控制,或者明確地糾正代碼中的無效字符見http://www.w3schools.com/xml/xml_elements.asp
+0

謝謝你。我在這裏嘗試過http://jsfiddle.net/D4t3s/,在這裏你可以看到結果。但是,並非所有子元素都包含表中的信息(電話號碼)...... – EnexoOnoma 2013-09-08 01:33:34

+0

我第一次沒有注意到有多個單元格。我已經在中間更新了幾行以獲得第一個(而不是第二個)後面的所有td元素 – 2013-09-08 01:42:11

0

它可以與一些正則表達式來完成。這甚至會工作,如果你的代碼的格式不正確(但你的表和TD標籤必須被正確格式化)。

// your original string  
$string = <<<heredoc 
    <table width="100%" align="center" class="mytable" border="1" cellspacing="1"> 
     <tr><td width="100%"><b>Δ.Ο.Υ. Α' ΑΘΗΝΩΝ (Α',Β',Γ',ΙΕ',ΚΒ') Κ.Α.: 1101</b> Αναξαγόρα 6-8, T.K. 100 10 Αθήνα</a><a name="aa8inon"></a></td></tr> 
     <tr><td width="8%">Προϊστάμενος</td><td width="8%">&nbsp;</td><td width="8%"><b>210</b>-52.72.810, 770</td></tr> 
     <tr><td width="8%">Υποδιευθυντής Φορολογίας</td><td width="8%">&nbsp;</td><td width="8%"><b>210</b>-52.72.804</td></tr> 
     <tr><td width="8%">Υποδιευθυντής Ελέγχου</td><td width="8%"><b>213</b> 1604121</td><td width="8%"><b>210</b>-52.72.807</td></tr> 
    </table> 

    <table width="100%" align="center" class="mytable" border="1" cellspacing="1"> 
     <tr><td width="100%"><b>Δ.Ο.Υ. ΚΑΤΟΙΚΩΝ ΕΞΩΤΕΡΙΚΟΥ Κ.Α.: 1125</b> Μετσόβου 4-T.K. 106 82 Αθήνα</td></tr> 
     <tr><td width="8%">Προϊστάμενος</td><td width="8%"><b>213</b> 1607155</td><td width="8%"><b>210</b>- 8204607</td></tr> 
     <tr><td width="8%">Υποδιευθυντής Φορολογίας</td><td width="8%">&nbsp;</td><td width="8%"><b>210</b>- 8204604</td></tr> 
    </table> 

heredoc; 

$patternTable = "/<table(.+?)table>/s"; // simple regExp for table tags 
$patternTd = '/<td[^>]*>(.+?)<\/td>/s'; // simple regExp for individual tds 

$xml = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><root/>'); 



preg_match_all($patternTable, $string, $matches); 

for($i=0; $i<sizeof($matches[1]); $i++){ 
    $tds = array(); 
    $attribute = ""; 
    $content = ""; 
    $tagName = ""; 
    preg_match_all($patternTd,$matches[1][$i], $tds); 
    for($j=0; $j<sizeof($tds[1]); $j++){ 
     if($j==0){ // first TD, add as attribute of note, taking the CONTENT of the td 
      $attribute = $tds[1][$j]; 
      $note = $xml->addChild("note"); 
      $note->addAttribute("doy", $attribute); 
     } else { // other tds 
      // there are 3 tds, the first is the name of the tag, the other two the contents 
      if($j %3 == 1){ 
       if($tagName != ""){ 
        $note->addChild($tagName, $tagContent); 
        $tagContent = ""; 
       } 
       $tagName = str_replace(" ", "_", $tds[1][$j]); 
      } else { 
       $tagContent.= $tds[1][$j]; 
      } 
     } 
    } 
    $note->addChild($tagName, $tagContent); // add the last opened node 


} 

$dom = dom_import_simplexml($xml)->ownerDocument; 
$dom->formatOutput = true; 
echo $dom->saveXML(); 

這個劇本給我的結果是:

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <note doy="&lt;b&gt;Δ.Ο.Υ. Α' ΑΘΗΝΩΝ (Α',Β',Γ',ΙΕ',ΚΒ') Κ.Α.: 1101&lt;/b&gt; Αναξαγόρα 6-8, T.K. 100 10 Αθήνα&lt;/a&gt;&lt;a name=&quot;aa8inon&quot;&gt;&lt;/a&gt;"> 
    <Προϊστάμενος>&nbsp;&lt;b&gt;210&lt;/b&gt;-52.72.810, 770</Προϊστάμενος> 
    <Υποδιευθυντής_Φορολογίας>&nbsp;&lt;b&gt;210&lt;/b&gt;-52.72.804</Υποδιευθυντής_Φορολογίας> 
    <Υποδιευθυντής_Ελέγχου>&lt;b&gt;213&lt;/b&gt; 1604121&lt;b&gt;210&lt;/b&gt;-52.72.807</Υποδιευθυντής_Ελέγχου> 
    </note> 
    <note doy="&lt;b&gt;Δ.Ο.Υ. ΚΑΤΟΙΚΩΝ ΕΞΩΤΕΡΙΚΟΥ Κ.Α.: 1125&lt;/b&gt; Μετσόβου 4-T.K. 106 82 Αθήνα"> 
    <Προϊστάμενος>&lt;b&gt;213&lt;/b&gt; 1604121&lt;b&gt;210&lt;/b&gt;-52.72.807&lt;b&gt;213&lt;/b&gt; 1607155&lt;b&gt;210&lt;/b&gt;- 8204607</Προϊστάμενος> 
    <Υποδιευθυντής_Φορολογίας>&nbsp;&lt;b&gt;210&lt;/b&gt;- 8204604</Υποδιευθυντής_Φορολογίας> 
    </note> 
</root> 

所有的屬性和標籤的內容的HTML被轉義,因爲它不是有效的有內內容的標籤。但是,如果您再次打印出來,它會保留您的內容。

請記住,此解決方案使用正則表達式以及SimpleXML和Dom(用於帶有換行和縮進的XML的漂亮打印) - 在性能方面它不會很快。如果你想跳過大教堂的一部分,你可以使用的

echo $xml->asXML() 

代替

$dom = dom_import_simplexml($xml)->ownerDocument; 
$dom->formatOutput = true; 
echo $dom->saveXML(); 

希望這有助於。

7

首先我應該注意到你想要輸出的XML似乎是無效的。

你可以利用優秀的QueryPath庫(http://querypath.org/)的最終你,你可以從PHP應用相同的邏輯來使用Javascript(使用jQuery的選擇器引擎)

下面是一段代碼產生有效的XML從輸入(順便說一句,我的希臘所以它使我更有意義):

libxml_use_internal_errors(true); 

$html = '<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /></head><body><table width="100%" align="center" class="mytable" border="1" cellspacing="1"> 
      <tr><td width="100%"><b>Δ.Ο.Υ. Α\' ΑΘΗΝΩΝ (Α\',Β\',Γ\',ΙΕ\',ΚΒ\') Κ.Α.: 1101</b> Αναξαγόρα 6-8, T.K. 100 10 Αθήνα</a><a name="aa8inon"></a></td></tr> 
      <tr><td width="8%">Προϊστάμενος</td><td width="8%">&nbsp;</td><td width="8%"><b>210</b>-52.72.810, 770</td></tr> 
      <tr><td width="8%">Υποδιευθυντής Φορολογίας</td><td width="8%">&nbsp;</td><td width="8%"><b>210</b>-52.72.804</td></tr> 
      <tr><td width="8%">Υποδιευθυντής Ελέγχου</td><td width="8%"><b>213</b> 1604121</td><td width="8%"><b>210</b>-52.72.807</td></tr> 
     </table> 
     <table width="100%" align="center" class="mytable" border="1" cellspacing="1"> 
      <tr><td width="100%"><b>Δ.Ο.Υ. ΚΑΤΟΙΚΩΝ ΕΞΩΤΕΡΙΚΟΥ Κ.Α.: 1125</b> Μετσόβου 4-T.K. 106 82 Αθήνα</td></tr> 
      <tr><td width="8%">Προϊστάμενος</td><td width="8%"><b>213</b> 1607155</td><td width="8%"><b>210</b>- 8204607</td></tr> 
      <tr><td width="8%">Υποδιευθυντής Φορολογίας</td><td width="8%">&nbsp;</td><td width="8%"><b>210</b>- 8204604</td></tr> 
     </table></body></html>'; 

$results = qp($html, 'table.mytable'); 

$xml = new \SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><notes/>'); 

foreach($results as $result) { 
    $note = $xml->addChild("note"); 

    foreach($result->children('tr') as $idx => $tr) { 
    if($idx == 0) { 
     $note->addAttribute("doy", $tr->children('td')->text()); 
     continue; 
    } 

    $tds = $tr->children('td'); 

    foreach($tds as $tidx => $td) { 
     if($tidx == 0) { 
     $person = $note->addChild("person"); 
     $person->addAttribute("title", trim($td->text())); 

     continue; 
     } 

     $phoneValue = $td->text(); 
     $phoneValue = str_replace(array(" ", ".", "-", "\xc2\xa0"), "", $phoneValue); 

     if($phoneValue != '') 
     $phone = $person->addChild("phone", $phoneValue); 
    } 
    } 
} 

$dom = dom_import_simplexml($xml)->ownerDocument; 
$dom->formatOutput = true; 
echo $dom->saveXML(); 

輸出:

<?xml version="1.0" encoding="UTF-8"?> 
    <notes> 
    <note doy="Δ.Ο.Υ. Α' ΑΘΗΝΩΝ (Α',Β',Γ',ΙΕ',ΚΒ') Κ.Α.: 1101 Αναξαγόρα 6-8, T.K. 100 10 Αθήνα"> 
     <person title="Προϊστάμενος"> 
     <phone>2105272810,770</phone> 
     </person> 
     <person title="Υποδιευθυντής Φορολογίας"> 
     <phone>2105272804</phone> 
     </person> 
     <person title="Υποδιευθυντής Ελέγχου"> 
     <phone>2131604121</phone> 
     <phone>2105272807</phone> 
     </person> 
    </note> 
    <note doy="Δ.Ο.Υ. ΚΑΤΟΙΚΩΝ ΕΞΩΤΕΡΙΚΟΥ Κ.Α.: 1125 Μετσόβου 4-T.K. 106 82 Αθήνα"> 
     <person title="Προϊστάμενος"> 
     <phone>2131607155</phone> 
     <phone>2108204607</phone> 
     </person> 
     <person title="Υποδιευθυντής Φορολογίας"> 
     <phone>2108204604</phone> 
     </person> 
    </note> 
    </notes> 

請注意:我已將您的html代碼包裝在<html><head><body>標記中,添加<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />標記以幫助querypath識別編碼。如果您需要更多信息,請參閱https://github.com/technosophos/querypath/issues/94。 如果您堅持創建您粘貼的問題的XML,則可以相應地更改示例。

此外,的QueryPath奇怪轉換&nbsp;0xC2 0xA0 (c2a0)(Unicode字符無間斷空間)(http://www.fileformat.info/info/unicode/char/a0/index.htm)因而在str_replace

+0

@ hek2mgl謹慎解釋XSLT如何與我的答案相關?他想要一些PHP/Javascript代碼將他的HTML表格轉換爲XML,他的HTML無效,這讓我想起了,就這些。 flup使用下面的XSLT添加了答案,而pm_hce使用了regex。每個人都在這裏加2美分。 – mobius 2013-09-15 07:31:33

+0

PHP有內置的xslt支持我會試試這個。 PHP中太多的foreach循環對性能不利 – hek2mgl 2013-09-15 09:39:02

+0

@ hek2mgl你是對的,但是用隨機HTML和XSLT掙扎並不是我的一杯茶。 (另外:http://www.mememaker.net/meme/if-you-think-you-can-use-xslt-with-some-random-html-page-youre-gonna-have-a-bad-) :) – mobius 2013-09-15 09:46:59

1

"\xc2\xa0"可以分析有效的XHTML爲XML,並用它轉化爲所需的XML格式一個XML樣式表。 由於HTML不是有效的XHTML,您必須先使用工具對其進行整理,例如an online tidy site。如果您需要在運行時執行此操作,則也有php library(與sample code)。

我收拾你在該網站的HTML,並應用以下樣式表是:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xhtml="http://www.w3.org/1999/xhtml" 
    xmlns:fn="http://www.w3.org/2005/xpath-functions"> 

    <xsl:template match="/xhtml:html/xhtml:body"> 
     <xsl:element name="notes"> 
      <xsl:apply-templates /> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="xhtml:table"> 
     <xsl:element name="note"> 
      <xsl:attribute name="doy"> 
       <xsl:value-of select="xhtml:tr[1]/xhtml:td" /> 
      </xsl:attribute> 
      <xsl:for-each select="xhtml:tr[position() != 1]"> 
       <xsl:element name="{translate(xhtml:td,' ','_')}"> 
        <xsl:for-each select="xhtml:td[position() != 1]"> 
         <!-- filter out empty/&nbsp; td elements --> 
         <xsl:if test="normalize-space(translate(.,'&#xc2;&#xa0;',' '))"> 
          <xsl:element name="τηλέφωνο"> 
           <xsl:value-of select="." /> 
          </xsl:element> 
         </xsl:if> 
        </xsl:for-each> 
       </xsl:element> 
      </xsl:for-each> 
     </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

這產生了:

<notes> 
    <note 
     doy="Δ.Ο.Υ. Α' ΑΘΗΝΩΝ (Α',Β',Γ',ΙΕ',ΚΒ') Κ.Α.: 1101 Αναξαγόρα 6-8, T.K. 100 10 Αθήνα"> 
     <Προϊστάμενος> 
      <τηλέφωνο>210-52.72.810, 770</τηλέφωνο> 
     </Προϊστάμενος> 
     <Υποδιευθυντής_Φορολογίας> 
      <τηλέφωνο>210-52.72.804</τηλέφωνο> 
     </Υποδιευθυντής_Φορολογίας> 
     <Υποδιευθυντής_Ελέγχου> 
      <τηλέφωνο>213 1604121</τηλέφωνο> 
      <τηλέφωνο>210-52.72.807</τηλέφωνο> 
     </Υποδιευθυντής_Ελέγχου> 
    </note> 

    <note 
     doy="Δ.Ο.Υ. ΚΑΤΟΙΚΩΝ ΕΞΩΤΕΡΙΚΟΥ Κ.Α.: 1125 Μετσόβου 4-T.K. 106 82 Αθήνα"> 
     <Προϊστάμενος> 
      <τηλέφωνο>213 1607155</τηλέφωνο> 
      <τηλέφωνο>210- 8204607</τηλέφωνο> 
     </Προϊστάμενος> 
     <Υποδιευθυντής_Φορολογίας> 
      <τηλέφωνο>210- 8204604</τηλέφωνο> 
     </Υποδιευθυντής_Φορολογίας> 
    </note> 
</notes> 

一些注意事項:

  • 看來怪異我希望在生成的XML中使用HTML標記。 XML包含數據和數據未格式化爲粗體且不包含錨點。
  • XML元素名稱不得包含空格所以我用下劃線
  • 必須指定UTF-8整潔網站或它會讓非ASCII字符亂碼取而代之
  • 我第一次嘗試堅持問題的XML格式,直到我看到一個不同的答案,你希望所有的電話號碼出現在XML中。因此我給了他們一個單獨的周圍元素標籤。
  • XML樣式表是獨立於語言的,有一種方法可以在大多數語言中應用它們。例如在php中,請參閱下面的內容,或者在javascript中,甚至在瀏覽器中,因爲您可以使用此樣式表來提供.xhtml,然後瀏覽器將呈現XML。但是通常會以相反的方式完成,爲XML數據創建HTML表示。我不確定何時何地需要創建XML。

示例PHP代碼:

<?php 
$xhtml_file = 'doc.xhtml'; 
$xsl_file = 'doc.xsl'; 
$doc = new DOMDocument(); 
$xsl = new XSLTProcessor(); 

$doc->load($xsl_file); 
$xsl->importStyleSheet($doc); 

$doc->load($xhtml_file); 
echo $xsl->transformToXML($doc); 
?>