xmllint命令处理xml与html的例子

 更新时间:2016年11月25日 16:54  点击:2128
xmllint是一个很方便的处理及验证xml、处理html的工具,linux下只要安装libxml2就可以使用这个命令。首先看下其结合--html 、--xpath参数处理html时的例子:


例子

curl http://www.111cn.net /ip/?q=8.8.8.8 2>/dev/null | xmllint --html --xpath "//ul[@id='csstb']" - 2>/dev/null | sed -e 's/<[^>]*>//g'
上例中主要是通过在123cha上查询的IP地址的归属情况后,通过提取结果(ul#csstb),只获取文本部分的内容。上面的脚本语句执行后的结果如下:


[您的查询]:8.8.8.8
本站主数据:
美国
本站辅数据:Google Public DNS提供:hypo
美国 Google免费的Google Public DNS提供:zwstar参考数据一:美国
参考数据二:美国
下面再结合示例看下其他主要参数的用法。

1、 --format

此参数用于格式化xml,使其具有良好的可读性。
假设有xml(person.xml)内容如下:


<person><name>ball</name><age>30</age<sex>male</sex></person> 
执行如下操作后其输出为更易读的xml格式:


#xmllint --format person.xml
    <?xml version="1.0"?>
    <person>
      <name>ball</name>
      <age>30</age>
      <sex>male</sex>
    </person> 

2、 --noblanks

与--format相反,有时为了节省传输量,我们希望去掉xml中的空白,这时我们可以使用--noblanks命令。
假设xml(person.xml)内容如下


<?xml version="1.0"?>
    <person>
      <name>ball</name>
      <age>30</age>
      <sex>male</sex>
    </person> 
执行该参数操作后,其输出结果为:


#xmllint --noblanks person.xml
    <?xml version="1.0"?>
    <person><name>ball</name><age>30</age><sex>male</sex></person> 
3、--schema

使用scheam验证xml文件的正确性(XML Schema 是基于 XML 的 DTD 替代者)
假设有xml文件(person.xml)和scheam文件(person.xsd)文件,内容分别如下

person.xml


<?xml version="1.0"?>
    <person>
      <name>ball</name>
      <age>30</age>
      <sex>male</sex>
    </person> 
person.xsd


<?xml version="1.0"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
      <xs:element name="name" type="xs:string"/>
      <xs:element name="age" type="xs:integer"/>
      <xs:element name="sex">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:enumeration value="male"/>
            <xs:enumeration value="female"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:element>
      <xs:element name="person">
        <xs:complexType>
          <xs:all>
            <xs:element ref="name"/>
            <xs:element ref="age"/>
            <xs:element ref="sex"/>
          </xs:all>
        </xs:complexType>
      </xs:element>
    </xs:schema> 
按如下命令执行后的结果是:


#xmllint --schema person.xsd person.xml
    <?xml version="1.0"?>
    <person>
      <name>ball</name>
      <age>30</age>
      <sex>male</sex>
    </person>
    person.xml validates 
注:默认情况下,验证后会输出验证的文件内容,可以使用 --noout选项去掉此输出,这样我们可以只得到最后的验证结果。


#xmllint --noout --schema person.xsd person.xml
person.xml validates 
下面我们改动person.xml,使这份文件age字段和sex都是不符合xsd定义的。


#xmllint --noout --schema person.xsd person.xml
person.xml:4: element age: Schemas validity error : Element 'age': 'not age' is not a valid value of the atomic type 'xs:integer'.
person.xml:5: element sex: Schemas validity error : Element 'sex': [facet 'enumeration'] The value 'test' is not an element of the set {'male', 'female'}.
person.xml:5: element sex: Schemas validity error : Element 'sex': 'test' is not a valid value of the local atomic type.
person.xml fails to validate
可以看到xmllint成功的报出了错误!

4、 关于--schema的输出

在讲输出之前先看下面一个场景,假如你想通过php执行xmllint然后拿到返回结果,你的代码通常应该是这个样子valid.php


<?php
    $command = "xmllint --noout --schema person.xsd person.xml";
    exec($command, $output, $retval);
    //出错时返回值不为0
    if ($retval != 0){
            var_dump($output);
    }
    else{
        echo "yeah!";
    } 
我们保持上文中person.xml的错误。
执行此代码,你会发现,你拿到的output不是错误,而是array(0) {}, amazing!
为什么会这样呢?

因为xmllint --schema,如果验证出错误,错误信息并不是通过标准输出(stdout)显示的,而是通过标准错误(stderr)进行显示的。
而exec的output参数拿到的,只能是标准输出(stdout)显示的内容。
所以,为了拿到出错信息,我们需要将标准错误重定向到标准输出,对应修改代码:


$command = "xmllint --noout --schema person.xsd person.xml 2>$1"; 
再次执行valid.php,错误信息顺利拿到!

例子

首先建立一份 xml 文档,命名为 po.xml,其内容如下:

<?xml version="1.0"?>
<purchaseOrder orderDate="1999-10-20">
    <shipTo country="US">
        <name>Alice Smith</name>
        <street>123 Maple Street</street>
        <city>Mill Valley</city>
        <state>CA</state>
        <zip>90952</zip>
    </shipTo>
    <billTo country="US">
        <name>Robert Smith</name>
        <street>8 Oak Avenue</street>
        <city>Old Town</city>
        <state>PA</state>
        <zip>95819</zip>
    </billTo>
    <comment>Hurry, my lawn is going wild!</comment>
    <items>
        <item partNum="872-AA">
            <productName>Lawnmower</productName>
            <quantity>1</quantity>
            <USPrice>148.95</USPrice>
            <comment>Confirm this is electric</comment>
        </item>
        <item partNum="926-AA">
            <productName>Baby Monitor</productName>
            <quantity>1</quantity>
            <USPrice>39.98</USPrice>
            <shipDate>1999-05-21</shipDate>
        </item>
    </items>
</purchaseOrder>然后为 po.xml 写的 schema 文件,取名为 po.xsd,内容如下:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 <xsd:annotation>
  <xsd:documentation xml:lang="en">
   Purchase order schema for Example.com.
   Copyright 2000 Example.com. All rights reserved.
  </xsd:documentation>
 </xsd:annotation>
 <xsd:element name="purchaseOrder" type="PurchaseOrderType"/>
 <xsd:element name="comment" type="xsd:string"/>
 <xsd:complexType name="PurchaseOrderType">
  <xsd:sequence>
   <xsd:element name="shipTo" type="USAddress"/>
   <xsd:element name="billTo" type="USAddress"/>
   <xsd:element ref="comment" minOccurs="0"/>
   <xsd:element name="items"  type="Items"/>
  </xsd:sequence>
  <xsd:attribute name="orderDate" type="xsd:date"/>
 </xsd:complexType>
 <xsd:complexType name="USAddress">
  <xsd:sequence>
   <xsd:element name="name"   type="xsd:string"/>
   <xsd:element name="street" type="xsd:string"/>
   <xsd:element name="city"   type="xsd:string"/>
   <xsd:element name="state"  type="xsd:string"/>
   <xsd:element name="zip"    type="xsd:decimal"/>
  </xsd:sequence>
  <xsd:attribute name="country" type="xsd:NMTOKEN"
     fixed="US"/>www.111cn.net
 </xsd:complexType>
 <xsd:complexType name="Items">
  <xsd:sequence>
   <xsd:element name="item" minOccurs="0" maxOccurs="unbounded">
    <xsd:complexType>
     <xsd:sequence>
      <xsd:element name="productName" type="xsd:string"/>
      <xsd:element name="quantity">
       <xsd:simpleType>
        <xsd:restriction base="xsd:positiveInteger">
         <xsd:maxExclusive value="100"/>
        </xsd:restriction>
       </xsd:simpleType>
      </xsd:element>
      <xsd:element name="USPrice"  type="xsd:decimal"/>
      <xsd:element ref="comment"   minOccurs="0"/>
      <xsd:element name="shipDate" type="xsd:date" minOccurs="0"/>
     </xsd:sequence>
     <xsd:attribute name="partNum" type="SKU" use="required"/>
    </xsd:complexType>
   </xsd:element>
  </xsd:sequence>
 </xsd:complexType>
 <!-- Stock Keeping Unit, a code for identifying products -->
 <xsd:simpleType name="SKU">
  <xsd:restriction base="xsd:string">
   <xsd:pattern value="d{3}-[A-Z]{2}"/>
  </xsd:restriction>
 </xsd:simpleType>
</xsd:schema>使用 xmllint 对 po.xml 文件进行校验:

$ xmllint   -schema po.xsd po.xml如果无出错信息,就说明校验通过了。

今天在做一个xml输出时发现我们直接使用echo输入的xml文档会提示Error: Object # has no method ‘load’错误的了,后改用了header()输出xml头文件就解决了,下面记录一下。

xml长的和txt文件太相似,所以导致我总和txt混为一谈。

 代码如下 复制代码
echo '<?xml version="1.0" encoding="UTF-8"?>
<sitemap>
<loc>http://www.111cn.net/</loc>
<lastmod>2013-01-22T11:00:18+08:00</lastmod>
</sitemap>
';
exit;

这么一段代码,死活输出的xml无法通过xml验证。

Error: Object # has no method ‘load’

最后查了半天都和直接放在1.xml里的文件一样

 代码如下 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<sitemap>
<loc>http://www.111cn.net/</loc>
<lastmod>2013-01-22T11:00:18+08:00</lastmod>
</sitemap>

加个header就好了。 折腾了好几个小时。。。。。

 代码如下 复制代码

<?php
header("Content-type:text/xml");
echo '<?xml version="1.0" encoding="UTF-8"?>
<sitemap>
<loc>http://www.111cn.net/</loc>
<lastmod>2013-01-22T11:00:18+08:00</lastmod>
</sitemap>
';
exit;

在php中simplexml_load_string() 函数把 XML 字符串载入对象中了,下面我来给大家介绍几个简单实例的同时也介绍在使用simplexml_load_string的一些需要注意的事项。

先用一段代码重现一下问题

乍一看,结果很让人费解:

 代码如下 复制代码

<?php
$string = <<<EOF
<data>
<foo><bar>hello</bar></foo>
<foo><bar>world</bar></foo>
</data>
EOF;

$data = simplexml_load_string($string);

print_r($data);
print_r($data->foo);
?>

乍一看,结果很让人费解:

 代码如下 复制代码

SimpleXMLElement Object
(
[foo] => Array
(
[0] => SimpleXMLElement Object
(
[bar] => hello
)
[1] => SimpleXMLElement Object
(
[bar] => world
)
)
)
SimpleXMLElement Object
(
[bar] => hello
)

明明print_r显示foo是一个有两个bar元素的数组,但是最后却仅仅显示了一个bar元素!
原因其实很简单,在如上所示simplexml_load_string的结果里,foo并不是数组,而是一个迭代对象!
可以这样确认:

 代码如下 复制代码

foreach ($data->foo as $v) print_r($v);
foreach ($data->children() as $v) print_r($v);

看来,print_r或者var_dump之类的表象并不完全可信,自己多留心吧。

假如我们获取的XML数据如下:(可以使用curl、fsockopen等方式获取)

 代码如下 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<dict num="219" id="219" name="219">
 <key>你好</key>
 <pos></pos>
 <acceptation>Array;Array;Array;</acceptation>
 <sent>
  <orig>Haven't seen you for a long time. How are you?</orig>
  <trans>多日不见了,你好吗?</trans>
 </sent>
 <sent>
  <orig>Hello! How are you?</orig>
  <trans>嘿,你好?</trans>
 </sent>
 <sent>
  <orig>Hello, Brooks!How are you?</orig>
  <trans>喂,布鲁克斯!你好吗?</trans>
 </sent>
 <sent>
  <orig>Hi, Barbara, how are you?</orig>
  <trans>嘿,芭芭拉,你好吗?</trans>
 </sent>
 <sent>
  <orig>How are you? -Quite well, thank you.</orig>
  <trans>你好吗?-很好,谢谢你。</trans>
 </sent>
</dict>

经过simplexml_load_string得到:

 代码如下 复制代码

SimpleXMLElement Object
(
    [@attributes] => Array
        (
            [num] => 219
            [id] => 219
            [name] => 219
        )

    [key] => 你好www.111cn.Net
    [pos] => SimpleXMLElement Object
        (
        )

    [acceptation] => Array;Array;Array;
    [sent] => Array
        (
            [0] => SimpleXMLElement Object
                (
                    [orig] => Haven't seen you for a long time. How are you?
                    [trans] => 多日不见了,你好吗?
                )

            [1] => SimpleXMLElement Object
                (
                    [orig] => Hello! How are you?
                    [trans] => 嘿,你好?
                )

            [2] => SimpleXMLElement Object
                (
                    [orig] => Hello, Brooks!How are you?
                    [trans] => 喂,布鲁克斯!你好吗?
                )

            [3] => SimpleXMLElement Object
                (
                    [orig] => Hi, Barbara, how are you?
                    [trans] => 嘿,芭芭拉,你好吗?
                )

            [4] => SimpleXMLElement Object
                (
                    [orig] => How are you? -Quite well, thank you.
                    [trans] => 你好吗?-很好,谢谢你。
                )

        )

)


我们在PHP语言中可以用以下方法取得我们想要的值:

 代码如下 复制代码

<?php
$data = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<dict num="219" id="219" name="219">
 <key>你好</key>
 <pos></pos>
 <acceptation>Array;Array;Array;</acceptation>
 <sent>
  <orig>Haven't seen you for a long time. How are you?</orig>
  <trans>多日不见了,你好吗?</trans>
 </sent>
 <sent>
  <orig>Hello! How are you?</orig>
  <trans>嘿,你好?</trans>
 </sent>
 <sent>
  <orig>Hello, Brooks!How are you?</orig>
  <trans>喂,布鲁克斯!你好吗?</trans>
 </sent>
 <sent>
  <orig>Hi, Barbara, how are you?</orig>
  <trans>嘿,芭芭拉,你好吗?</trans>
 </sent>
 <sent>
  <orig>How are you? -Quite well, thank you.</orig>
  <trans>你好吗?-很好,谢谢你。</trans>
 </sent>
</dict>
XML;
$xmldata = simplexml_load_string($data);
header("Content-Type: text/html; charset=UTF-8");
print_r($xmldata);
echo "<br />".trim($xmldata->sent[0]->orig); //Haven't seen you for a long time. How are you?
echo "<br />".trim($xmldata->key); //你好
?>

 

在api数据处理时xml结构的数据与json数据都是非常重要的一个环节了,今天我来简单的以实例来给各位介绍xml的基本操作技巧。

当处理基于XML应用程序时,开发者经常需要建立XML编码数据结构。例如,Web中基于用户输入的XML状态模板,服务器请求XML语句,以及基于运行时间参数的客户响应。
 
    尽管XML数据结构的构建比较费时,但如果使用成熟的PHP DOM应用程序接口,一切都会变得简单明了。本文达内php培训老师将向你介绍PHP DOM应用程序接口的主要功能,演示如何生成一个正确的XML完整文件并将其保存到磁盘中。
 
    创建文档类型声明
    一般而言,XML声明放在文档顶部。在PHP中声明十分简单:只需实例化一个DOM文档类的对象并赋予它一个版本号。查看程序清单A:
    程序清单 A

 代码如下 复制代码
    <?php
    // create doctype
    $dom = new DOMDocument("1.0");
    // display document in browser as plain text
    // display document in browser as plain text
    // for readability purposes
    header("Content-Type: text/plain");
    // save and display tree
    echo $dom->saveXML();
    ?>

请注意DOM文档对象的saveXML()方法。稍后我再详细介绍这一方法,现在你只需要简单认识到它用于输出XML文档的当前快照到一个文件或浏览器。在本例,为增强可读性,我已经将ASCII码文本直接输出至浏览器。在实际应用中,可将以text/XML头文件发送到浏览器。
    如在浏览器中查看输出,你可看到如下代码:
    <?xml version="1.0"?>
    添加元素和文本节点
    XML真正强大的功能是来自其元素与封装的内容。幸运的是,一旦你初始化DOM文档,很多操作变得很简单。此过程包含如下两步骤:
    对想添加的每一元素或文本节点,通过元素名或文本内容调用DOM文档对象的createElement()或createTextNode()方法。这将创建对应于元素或文本节点的新对象。
    通过调用节点的appendChild()方法,并把其传递给上一步中创建的对象,并在XML文档树中将元素或文本节点添加到父节点。
    以下范例将清楚地演示这2步骤,请查看程序清单B。

程序清单 B

 代码如下 复制代码

 <?php
    // create doctype
    $dom = new DOMDocument("1.0");
    // display document in browser as plain text
    // for readability purposes
    header("Content-Type: text/plain");
    // create root element
    $root = $dom->createElement("toppings");
    $dom->appendChild($root);
    // create child element
    $item = $dom->createElement("item");
    $root->appendChild($item);
    // create text node
    $text = $dom->createTextNode("pepperoniwww.111cn.net");
    $item->appendChild($text);
    // save and display tree
    echo $dom->saveXML();
    ?>

这里,我首先创建一个名字为<toppings>的根元素,并使它归于XML头文件中。然后,我建立名为<item>的元素并使它归于根元素。最后,我又创建一个值为“pepperoni”的文本节点并使它归于<item>元素。最终结果如下:

<?xml version="1.0"?>
    <toppings>
    <item>pepperoniwww.111cn.net</item>
    </toppings>

如果你想添加另外一个topping,只需创建另外一个<item>并添加不同的内容,如程序清单C所示。
    程序清单C

 代码如下 复制代码

<?php
    // create doctype
    $dom = new DOMDocument("1.0");
    // display document in browser as plain text
    // for readability purposes
    header("Content-Type: text/plain");
    // create root element
    $root = $dom->createElement("toppings");
    $dom->appendChild($root);
    // create child element
    $item = $dom->createElement("item");
    $root->appendChild($item);
    // create text node
    $text = $dom->createTextNode("pepperoni");
    $item->appendChild($text);
    // create child element
    $item = $dom->createElement("item");
    $root->appendChild($item);
    // create another text node
    $text = $dom->createTextNode("tomato");
    $item->appendChild($text);
    // save and display tree
    echo $dom->saveXML();
    ?>
    以下是执行程序清单C后的输出:
    <?xml version="1.0"?>
    <toppings>
    <item>pepperoni</item>
    <item>tomato</item>
    </toppings>

添加属性

前面我们接着继续为大家分享php生成xml简单实例代码(1)的内容,下面北京php培训接着继续为大家分享php生成xml简单实例代码(2)的内容。
 
通过使用属性,你也可以添加适合的信息到元素。对于PHP DOM API,添加属性需要两步:首先用DOM文档对象的createAttribute()方法创建拥有此属性名字的节点,然后将文档节点添加到拥有属性值的属性节点。详见程序清单D。
    程序清单 D
 

 代码如下 复制代码
   <?php
    // create doctype
    $dom = new DOMDocument("1.0");
    // display document in browser as plain text
    // for readability purposes
    header("Content-Type: text/plain");
    // create root element
    $root = $dom->createElement("toppings");
    $dom->appendChild($root);
    // create child element
    $item = $dom->createElement("item");
    $root->appendChild($item);
    // create text node
    $text = $dom->createTextNode("pepperoni");
    $item->appendChild($text);
    // create attribute node
    $price = $dom->createAttribute("price");
    $item->appendChild($price);
    // create attribute value node
    $priceValue = $dom->createTextNode("4");
    $price->appendChild($priceValue);
    // save and display tree
    echo $dom->saveXML();
    ?>
    输出如下所示:
    <?xml version="1.0"?>
    <toppings>
    <item price="4">pepperoni</item>
    </toppings>

    添加CDATA模块和过程向导
    虽然不经常使用CDATA模块和过程向导,但是通过调用DOM文档对象的createCDATASection()和createProcessingInstruction()方法, PHP API 也能很好地支持CDATA和过程向导,请见程序清单E。
    程序清单 E

 代码如下 复制代码
    <?php
    // create doctype
    // create doctype
    $dom = new DOMDocument("1.0");
    // display document in browser as plain text
    // for readability purposes
    header("Content-Type: text/plain");
    // create root element
    $root = $dom->createElement("toppings");
    $dom->appendChild($root);
    // create child element
    $item = $dom->createElement("item");
    $root->appendChild($item);
    // create text node
    $text = $dom->createTextNode("pepperoni");
    $item->appendChild($text);
    // create attribute node
    $price = $dom->createAttribute("price");
    $item->appendChild($price);
    // create attribute value node
    $priceValue = $dom->createTextNode("4");
    $price->appendChild($priceValue);
    // create CDATA section
    $cdata = $dom->createCDATASection(" Customer requests that pizza be sliced into 16 square pieces ");
    $root->appendChild($cdata);
    // create PI
    $pi = $dom->createProcessingInstruction("pizza", "bake()");
    $root->appendChild($pi);
    // save and display tree
    echo $dom->saveXML();
    ?>
    输出如下所示:
    <?xml version="1.0"?>
    <toppings>
    <item price="4">pepperoni</item>
    <![CDATA[
    Customer requests that pizza be sliced into 16 square pieces
    ]]>
    <?pizza bake()?>
    </toppings>


保存结果
    一旦已经实现你的目标,就可以将结果保存在一个文件或存储于PHP的变量。通过调用带有文件名的save()方法可以将结果保存在文件中,而通过调用saveXML()方法可存储于PHP的变量。请参考以下实例(程序清单F):
    程序清单 F
 

 代码如下 复制代码
   <?php
    // create doctype
    $dom = new DOMDocument("1.0");
    // create root element
    $root = $dom->createElement("toppings");
    $dom->appendChild($root);
    $dom->formatOutput=true;
    // create child element
    $item = $dom->createElement("item");
    $root->appendChild($item);
    // create text node
    $text = $dom->createTextNode("pepperoni");
    $item->appendChild($text);
    // create attribute node
    $price = $dom->createAttribute("price");
    $item->appendChild($price);
    // create attribute value node
    $priceValue = $dom->createTextNode("4");
    $price->appendChild($priceValue);
    // create CDATA section
    $cdata = $dom->createCDATASection(" Customer requests that pizza be
    sliced into 16 square pieces ");
    $root->appendChild($cdata);
    // create PI
    $pi = $dom->createProcessingInstruction("pizza", "bake()");
    $root->appendChild($pi);
    // save tree to file
    $dom->save("order.xml");
    // save tree to string
    $order = $dom->save("order.xml");
    ?>
    下面是实际的例子,大家可以测试下。
    xml.php(生成xml)
    <?
    $conn = mysql_connect('localhost', 'root', '123456') or die('Could not connect: ' . mysql_error());
    mysql_select_db('vdigital', $conn) or die ('Can't use database : ' . mysql_error());
    $str = "SELECT id,username FROM `admin` GROUP BY `id` ORDER BY `id` ASC";
    $result = mysql_query($str) or die("Invalid query: " . mysql_error());
    if($result)
    {
    $xmlDoc = new DOMDocument();
    if(!file_exists("01.xml")){
    $xmlstr = "<?xml version='1.0' encoding='utf-8' ?><message></message>";
    $xmlDoc->loadXML($xmlstr);
    $xmlDoc->save("01.xml");
    }
    else { $xmlDoc->load("01.xml");}
    $Root = $xmlDoc->documentElement;
    while ($arr = mysql_fetch_array($result)){
    $node1 = $xmlDoc->createElement("id");
    $text = $xmlDoc->createTextNode(iconv("GB2312","UTF-8",$arr["id"]));
    $node1->appendChild($text);
    $node2 = $xmlDoc->createElement("name");
    $text2 = $xmlDoc->createTextNode(iconv("GB2312","UTF-8",$arr["username"]));
    $node2->appendChild($text2);
    $Root->appendChild($node1);
    $Root->appendChild($node2);
    $xmlDoc->save("01.xml");
    }
    }
    mysql_close($conn);
    ?>
    test.php(应用测试)
    <?
    $xmlDoc = new DOMDocument();
    $xmlDoc->load("http://localhost/xml/xml.php");
    $x=$xmlDoc->getElementsByTagName('name');
    for ($i=0; $i<=$x->length-1; $i++)
    {
    if(strpos($x->item($i)->nodeValue,"fang")!==false)
    {
    echo $x->item($i)->parentNode->childNodes->item(1)->nodeValue;
    }
    }
    ?>

 

今天在利用php做一个交互时我需要生成xml文档,但是发现xml中汉字全部乱码了,下面小编来给各位同学介绍一下此问题解决办法。


先看一个把数组转换xml

 代码如下 复制代码

function array2xml($array, $xml = false){
    if($xml === false){
        $xml = new SimpleXMLElement('<root/>');
    }
    foreach($array as $key => $value){
        if(is_array($value)){
            array2xml($value, $xml->addChild($key));
        }else{
            $xml->addChild($key, $value);
        }
    }
    return $xml->asXML();
}
 
header('Content-type: text/xml');
print array2xml($array);

这样如果没有中文汉字没问题

如果有中文就有问题了当内容出现汉字时会出现为空的情况,解决办法是转编码处理

 

 代码如下 复制代码
/*
php 数组转换成xml
*/
 
function array2xml($array, $xml = false){
    if($xml === false){
        $xml = new SimpleXMLElement('<root/>');
    }
    foreach($array as $key => $value){
        if(is_array($value)){
            array2xml($value, $xml->addChild($key));
        }else{
            //$value=utf8_encode($value);
 
            if (preg_match("/([x81-xfe][x40-xfe])/", $value, $match)) {
                $value = iconv('gbk', 'utf-8', $value);   //判断是否有汉字出现
            }
            $xml->addChild($key, $value);
        }
    }
    return $xml->asXML();
}
[!--infotagslink--]

相关文章

  • Linux下PHP安装curl扩展支持https例子

    安装curl扩展支持https是非常的重要现在许多的网站都使用了https了,下面我们来看一篇关于PHP安装curl扩展支持https例子吧。 问题: 线上运行的lamp服务器,默认yu...2016-11-25
  • Windows批量搜索并复制/剪切文件的批处理程序实例

    这篇文章主要介绍了Windows批量搜索并复制/剪切文件的批处理程序实例,需要的朋友可以参考下...2020-06-30
  • 使用percona-toolkit操作MySQL的实用命令小结

    1.pt-archiver 功能介绍: 将mysql数据库中表的记录归档到另外一个表或者文件 用法介绍: pt-archiver [OPTION...] --source DSN --where WHERE 这个工具只是归档旧的数据,不会对线上数据的OLTP查询造成太大影响,你可以将...2015-11-24
  • BAT批处理判断服务是否正常运行的方法(批处理命令综合应用)

    批处理就是对某对象进行批量的处理,通常被认为是一种简化的脚本语言,它应用于DOS和Windows系统中。这篇文章主要介绍了BAT批处理判断服务是否正常运行(批处理命令综合应用),需要的朋友可以参考下...2020-06-30
  • Linux中grep命令详解

    grep命令是Linux系统中最重要的命令之一,功能是从文本文件或管道数据流中筛选匹配的行和数据,如果再配合正则表达式,功能十分强大,是Linux运维人员必备的命令,这篇文章主要介绍了Linux中grep详解,需要的朋友可以参考下...2023-02-15
  • C#隐式运行CMD命令(隐藏命令窗口)

    这篇文章主要介绍了C#隐式运行CMD命令(隐藏命令窗口),本文实现在winform窗口中运行CMD命令,需要的朋友可以参考下...2020-06-25
  • PHP实现连接设备、通讯和发送命令的方法

    本文实例讲述了PHP实现连接设备、通讯和发送命令的方法。分享给大家供大家参考。具体如下:开发的BS架构的软件(PHP),需要跟设备进行通讯,在此记录一下,欢迎各位指正:1. 采用php socket技术使用TCP/IP连接设备参数$service_po...2015-10-21
  • PHP file_get_contents设置超时处理方法

    file_get_contents的超时处理话说,从PHP5开始,file_get_content已经支持context了(手册上写着:5.0.0 Added the context support. ),也就是说,从5.0开始,file_get_contents其实也可以POST数据。今天说的这篇是讲超时的,确实在...2013-10-04
  • C#多线程中的异常处理操作示例

    这篇文章主要介绍了C#多线程中的异常处理操作,涉及C#多线程及异常的捕获、处理等相关操作技巧,需要的朋友可以参考下...2020-06-25
  • 对MySQL日志操作的一些基本命令总结

    MySQL日志主要包含:错误日志、查询日志、慢查询日志、事务日志、二进制日志;日志是mysql数据库的重要组成部分。日志文件中记录着mysql数据库运行期间发生的变化;也就是说用来记录mysql数据库的客户端连接状况、SQL语句...2015-11-24
  • postgresql 中的时间处理小技巧(推荐)

    这篇文章主要介绍了postgresql 中的时间处理小技巧(推荐),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-29
  • Python同时处理多个异常的方法

    这篇文章主要介绍了Python同时处理多个异常的方法,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下...2020-07-29
  • Mysql命令大全(详细篇)

    一、连接Mysql格式: mysql -h主机地址 -u用户名 -p用户密码1、连接到本机上的MYSQL。首先打开DOS窗口,然后进入目录mysql/bin,再键入命令mysql -u root -p,回车后提示你输密码.注意用户名前可以有空格也可以没有空格,但是密...2015-11-08
  • C#异常处理中try和catch语句及finally语句的用法示例

    这篇文章主要介绍了C#异常处理中try和catch语句及finally语句的用法示例,finally语句的使用涉及到了C#的垃圾回收特性,需要的朋友可以参考下...2020-06-25
  • php使用floor去掉小数点的例子

    floor会产生小数了如果我们不希望有小数我们是可以去除小数点的了,下面一聚教程小编来为各位介绍php使用floor去掉小数点的例子,希望对各位有帮助。 float floor (...2016-11-25
  • 查看Redis内存信息的命令

    Redis 是一个开源、高性能的Key-Value数据库,被广泛应用在服务器各种场景中。本文介绍几个查看Redis内存信息的命令,包括常用的info memory、info keyspace、bigkeys等。...2021-01-15
  • 解决jmap命令打印JVM堆信息异常的问题

    这篇文章主要介绍了解决jmap命令打印JVM堆信息异常的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-12-04
  • python用moviepy对视频进行简单的处理

    这篇文章主要介绍了python如何用moviepy对视频进行简单的处理,帮助大家更好的利用python处理视频,感兴趣的朋友可以了解下...2021-03-11
  • C#异常处理详解

    这篇文章介绍了C#异常处理,有需要的朋友可以参考一下...2020-06-25
  • MySQL的常用命令集锦

    下面是我们经常会用到且非常有用的MySQL命令。下面你看到#表示在Unix命令行下执行命令,看到mysql>表示当前已经登录MySQL服务器,是在mysql客户端执行mysql命令。 登录MySQL,如果连接远程数据库,需要用-h指定hostname。登...2015-11-24