1

这是两个包含我希望以 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>

table 标记下方的第一行是根元素,所有其他行都是子元素。如果我在正确命名元素时犯了一些错误,请原谅我。

例如在<tr><td>你看到的第一个之间

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

这将是根元素中的属性名称。

下面的第一<td></td>Προϊστάμενος是子元素,从下一行<td>到最后一行</td>是该子元素<tr>的数据。

这就是我想要的

<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>

这可能吗?任何代码表示赞赏。

4

5 回答 5

8

首先,我应该注意您要输出的 XML 似乎无效。

您可以使用优秀的查询路径库(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 character no-break-space) ( http://www.fileformat.info/info/unicode/char/a0/index.htm ) 因此"\xc2\xa0"str_replace

于 2013-09-11T09:00:05.187 回答
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; 和 " 作为 & quot; 和 ' 作为 & apos; 但是,另一种可能性是用 <[!CDATA[ ... ]]> 包围标记,以告诉 XML 解释器不要解析该区域中的字符。
  2. 虽然您可以使用希腊字符命名 XML 元素,但请注意,并非所有字符都是有效的或 XML 元素名称,因此您必须对可以在第一个单元格中显示的文本进行某种控制,或者明确纠正您的代码。请参阅http://www.w3schools.com/xml/xml_elements.asp
于 2013-09-08T00:57:05.453 回答
1

您可以将有效的 XHTML 解析为 XML,并使用 XML 样式表将其转换为所需的 XML 格式。由于 HTML 不是有效的 XHTML,您必须首先使用工具来整理它,例如在线整理网站。如果您需要在运行时执行此操作,也有一个php 库(带有示例代码)。

我在该站点上整理了您的 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);
?>
于 2013-09-14T11:08:45.737 回答
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>元素内容。

我想您可以使用一些 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]使用 PHP 从 HTML 列表生成 XML

于 2013-09-07T20:58:09.757 回答
0

可以用一些正则表达式来完成。即使您的代码格式不正确(但您的 table 和 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)——就性能而言,它不会很快。如果你想跳过 Dom 部分,你可以使用

echo $xml->asXML()

代替

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

希望这可以帮助。

于 2013-09-09T09:35:44.553 回答