• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • xml_parser_set_option()

    (PHP 4, PHP 5, PHP 7)

    为指定 XML 解析进行选项设置

    说明

    xml_parser_set_option(resource $parser,int $option, mixed $value): bool
    $parser
    指向要设置选项信息的 XML 解析器的指针。
    $option
    要设置的选项名称。请参考下文。
    $value
    要给选项设置的新值。

    如果$parser参数没有指向一个合法的解析器或者指定的选项无法设置,该函数将返回FALSE,否则将会把选项设置为指定的值并返回TRUE

    可被设置的选项如下:

    XML 解析器选项
    选项常量数据类型描述
    XML_OPTION_CASE_FOLDINGinteger控制在该 XML 解析器中大小写折叠(case-folding)是否有效。其默认值为有效。
    XML_OPTION_SKIP_TAGSTARTinteger指明在一个标记名前应略过几个字符。
    XML_OPTION_SKIP_WHITEinteger是否略过由白空字符组成的值。
    XML_OPTION_TARGET_ENCODINGstring设置该 XML 解析器所使用的目标编码(target encoding)方式。其默认值和由xml_parser_create()函数设置的源编码(source encoding)方式相同。支持的目标编码方式有ISO-8859-1US-ASCIIUTF-8
    The option XML_OPTION_SKIP_WHITE has no effect in my PHP 5.2.6 (with expat-1.95.8-5). To skip cdata composed of white space only, simply check for that at the beginning of your cdata callback function:
    <?php
    function callback_cdata($parser, $cdata)
    {
     if(!trim($cdata))
     return;
     // ... continue processing ...
    }
    ?>
    
    In the function below, you need to update two lines if you don't want php to throw warnings. 
    change these two:
          $elements[$index]['attributes'] = $tag['attributes'];
          $elements[$index]['content'] = $tag['value'];
    to this:
       $elements[$index]['attributes'] = empty($tag['attributes']) ? "" : $tag['attributes'];
       $elements[$index]['content']  = empty($tag['value']) ? "" : $tag['value'];
    Had one heck of a time getting curl to send my XML request. Tried a lot of different things, FINALLY ended up with this. 
    Im making a curl request to paymentech / Orbital 's payment gateway.  Essentially, I took the same header i made for the fsockopen() request, and used it for this curl request. (Hostinc company didnt allow fsockopen().
    You'll note that this specific gateway requires a custom content type header. Thats what gave me the most trouble. When using the CURLOPT_HTTPHEADER, and CURLOPT_POSTFIELDS together, it doesnt matter, it sends the default post header because of CURLOPT_POSTFIELDS. 
    <?php
    $url = "https://example.com";
    $page = "/proccessing_page.cgi";
    $post_string = "<YourXML>All XML stuff Here</YourXML>";
        $header = "POST ".$page." HTTP/1.0 \r\n";
        $header .= "MIME-Version: 1.0 \r\n";
        $header .= "Content-type: application/PTI26 \r\n";
        $header .= "Content-length: ".strlen($post_string)." \r\n";
        $header .= "Content-transfer-encoding: text \r\n";
        $header .= "Request-number: 1 \r\n";
        $header .= "Document-type: Request \r\n";
        $header .= "Interface-Version: Test 1.4 \r\n";
        $header .= "Connection: close \r\n\r\n";
        $header .= $post_string;
        
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL,$url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_TIMEOUT, 4); 
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $header);
        $data = curl_exec($ch);     if (curl_errno($ch)) {
          print curl_error($ch);
        } else {
          curl_close($ch);
        }
    // use XML Parser on $data, and your set!
        $xml_parser = xml_parser_create();
        xml_parser_set_option($xml_parser,XML_OPTION_CASE_FOLDING,0);
        xml_parser_set_option($xml_parser,XML_OPTION_SKIP_WHITE,1);
        xml_parse_into_struct($xml_parser, $data, $vals, $index);
        xml_parser_free($xml_parser);
    // $vals = array of XML tags. Go get em!
    ?>
    Worked like a dream for me. Enjoy!
    XML_OPTION_SKIP_WHITE works for me (linux, php 4.2.1)
    phpinfo says :
    XML Support active 
    XML Namespace Support active 
    EXPAT Version expat_1.95.2 
    i guess it depends on expat version/presence
    Re: anony at mous dot com
    case folding is a violation of the XHTML specification. xhtml is all in lowercase to be inline with the DOM
    XML is case sensitive, then, from my point of view, disabling case folding doesn't goes against xml 1.0 specifications but the contrary, disabling case folding allow us to distiguish between diferent cases of the same letter ('a' and 'A') which of XML are two diferent things.
    From my point of view, disabling case folding is a good practice and I think it should be disabled by default.
    More information on:
    http://www.isacat.net/2001/xml/case.htm
    and
    http://www.w3.org/TR/REC-xml
    Thank you.
    The two 'skip' tags are not available to windows users using PHP 4.0.4. The following:
    $skipWhite = xml_parser_get_option ($xmlParser,XML_OPTION_SKIP_WHITE);
    $skipTagStart = xml_parser_get_option ($xmlParser,XML_OPTION_SKIP_TAGSTART);
    generates the following errors:
    Warning: xml_parser_get_option: unknown option in c:/program files/abria merlin/apache/htdocs/xml/sax_test.php on line 230
    Disable case folding or your code will be violating the XML 1.0 specification.
    A little mod to a function posted here...
    function xml_to_array( $file )
    {
      $parser = xml_parser_create();
      xml_parser_set_option( $parser, XML_OPTION_CASE_FOLDING, 0 );
      xml_parser_set_option( $parser, XML_OPTION_SKIP_WHITE, 1 );
      xml_parse_into_struct( $parser, file_get_contents($file), $tags );
      xml_parser_free( $parser );
      
      $elements = array();
      $stack = array();
      foreach ( $tags as $tag )
      {
        $index = count( $elements );
        if ( $tag['type'] == "complete" || $tag['type'] == "open" )
        {
          $elements[$index] = array();
          $elements[$index]['name'] = $tag['tag'];
          $elements[$index]['attributes'] = $tag['attributes'];
          $elements[$index]['content'] = $tag['value'];
          
          if ( $tag['type'] == "open" )
          {  # push
            $elements[$index]['children'] = array();
            $stack[count($stack)] = &$elements;
            $elements = &$elements[$index]['children'];
          }
        }
        
        if ( $tag['type'] == "close" )
        {  # pop
          $elements = &$stack[count($stack) - 1];
          unset($stack[count($stack) - 1]);
        }
      }
      return $elements[0];
    }