print "</pre>"; print "\n<br>\n"; /** * splitting a qualified tag name (no namespace) */ print "splitting qualified tag name (no namespace):<br>\n"; print "<pre>"; print_r(XML_Util::splitQualifiedName("foo")); print "</pre>"; print "\n<br>\n"; /** * splitting a qualified tag name (no namespace, but default namespace specified) */ print "splitting qualified tag name (no namespace, but default namespace specified):<br>\n"; print "<pre>"; print_r(XML_Util::splitQualifiedName("foo", "bar")); print "</pre>"; print "\n<br>\n"; /** * verifying XML names */ print "verifying 'My private tag':<br>\n"; print "<pre>"; print_r(XML_Util::isValidname('My Private Tag')); print "</pre>"; print "\n<br><br>\n"; print "verifying '-MyTag':<br>\n"; print "<pre>"; print_r(XML_Util::isValidname('-MyTag')); print "</pre>"; print "\n<br><br>\n";
/** * create a start element * * <code> * require_once 'XML/Util.php'; * * // create an XML start element: * $tag = XML_Util::createStartElement("myNs:myTag", array("foo" => "bar") ,"http://www.w3c.org/myNs#"); * </code> * * @access public * @static * @param string $qname qualified tagname (including namespace) * @param array $attributes array containg attributes * @param string $namespaceUri URI of the namespace * @param boolean $multiline whether to create a multiline tag where each attribute gets written to a single line * @param string $indent string used to indent attributes (_auto indents attributes so they start at the same column) * @param string $linebreak string used for linebreaks * @return string $string XML start element * @see XML_Util::createEndElement(), XML_Util::createTag() */ function createStartElement($qname, $attributes = array(), $namespaceUri = null, $multiline = false, $indent = '_auto', $linebreak = "\n") { // if no attributes hav been set, use empty attributes if (!isset($attributes) || !is_array($attributes)) { $attributes = array(); } if ($namespaceUri != null) { $parts = XML_Util::splitQualifiedName($qname); } // check for multiline attributes if ($multiline === true) { if ($indent === "_auto") { $indent = str_repeat(" ", strlen($qname) + 2); } } if ($namespaceUri != null) { // is a namespace given if (isset($parts["namespace"]) && !empty($parts["namespace"])) { $attributes["xmlns:" . $parts["namespace"]] = $namespaceUri; } else { // define this Uri as the default namespace $attributes["xmlns"] = $namespaceUri; } } // create attribute list $attList = XML_Util::attributesToString($attributes, true, $multiline, $indent, $linebreak); $element = sprintf("<%s%s>", $qname, $attList); return $element; }
print '</pre>'; print "\n<br>\n"; /** * splitting a qualified tag name (no namespace) */ print 'splitting qualified tag name (no namespace):<br>'; print '<pre>'; print_r(XML_Util::splitQualifiedName('foo')); print '</pre>'; print "\n<br>\n"; /** * splitting a qualified tag name (no namespace, but default namespace specified) */ print 'splitting qualified tag name ' . '(no namespace, but default namespace specified):<br>'; print '<pre>'; print_r(XML_Util::splitQualifiedName('foo', 'bar')); print '</pre>'; print "\n<br>\n"; /** * verifying XML names */ print 'verifying \'My private tag\':<br>'; print '<pre>'; print_r(XML_Util::isValidname('My Private Tag')); print '</pre>'; print "\n<br><br>\n"; print 'verifying \'-MyTag\':<br>'; print '<pre>'; print_r(XML_Util::isValidname('-MyTag')); print '</pre>'; print "\n<br><br>\n";
/** * create a tag from an array * this method awaits an array in the following format * <pre> * array( * "qname" => $qname // qualified name of the tag * "namespace" => $namespace // namespace prefix (optional, if qname is specified or no namespace) * "localpart" => $localpart, // local part of the tagname (optional, if qname is specified) * "attributes" => array(), // array containing all attributes (optional) * "content" => $content, // tag content (optional) * "namespaceUri" => $namespaceUri // namespaceUri for the given namespace (optional) * ) * </pre> * * <code> * require_once 'XML/Util.php'; * * $tag = array( * "qname" => "foo:bar", * "namespaceUri" => "http://foo.com", * "attributes" => array( "key" => "value", "argh" => "fruit&vegetable" ), * "content" => "I'm inside the tag", * ); * // creating a tag with qualified name and namespaceUri * $string = PEAR_PackageFile_Generator_v2_XML_Util::createTagFromArray($tag); * </code> * * @access public * @static * @param array $tag tag definition * @param integer $replaceEntities whether to replace XML special chars in content, embedd it in a CData section or none of both * @param boolean $multiline whether to create a multiline tag where each attribute gets written to a single line * @param string $indent string used to indent attributes (_auto indents attributes so they start at the same column) * @param string $linebreak string used for linebreaks * @return string $string XML tag * @see PEAR_PackageFile_Generator_v2_XML_Util::createTag() * @uses XML_Util::attributesToString() to serialize the attributes of the tag * @uses XML_Util::splitQualifiedName() to get local part and namespace of a qualified name */ function createTagFromArray($tag, $replaceEntities = PEAR_PackageFile_Generator_v2_XML_Util_REPLACE_ENTITIES, $multiline = false, $indent = "_auto", $linebreak = "\n", $encoding = PEAR_PackageFile_Generator_v2_XML_Util_ENTITIES_XML) { if (isset($tag["content"]) && !is_scalar($tag["content"])) { return XML_Util::raiseError("Supplied non-scalar value as tag content", PEAR_PackageFile_Generator_v2_XML_Util_ERROR_NON_SCALAR_CONTENT); } if (!isset($tag['qname']) && !isset($tag['localPart'])) { return XML_Util::raiseError('You must either supply a qualified name (qname) or local tag name (localPart).', PEAR_PackageFile_Generator_v2_XML_Util_ERROR_NO_TAG_NAME); } // if no attributes hav been set, use empty attributes if (!isset($tag["attributes"]) || !is_array($tag["attributes"])) { $tag["attributes"] = array(); } // qualified name is not given if (!isset($tag["qname"])) { // check for namespace if (isset($tag["namespace"]) && !empty($tag["namespace"])) { $tag["qname"] = $tag["namespace"] . ":" . $tag["localPart"]; } else { $tag["qname"] = $tag["localPart"]; } // namespace URI is set, but no namespace } elseif (isset($tag["namespaceUri"]) && !isset($tag["namespace"])) { $parts = XML_Util::splitQualifiedName($tag["qname"]); $tag["localPart"] = $parts["localPart"]; if (isset($parts["namespace"])) { $tag["namespace"] = $parts["namespace"]; } } if (isset($tag["namespaceUri"]) && !empty($tag["namespaceUri"])) { // is a namespace given if (isset($tag["namespace"]) && !empty($tag["namespace"])) { $tag["attributes"]["xmlns:" . $tag["namespace"]] = $tag["namespaceUri"]; } else { // define this Uri as the default namespace $tag["attributes"]["xmlns"] = $tag["namespaceUri"]; } } // check for multiline attributes if ($multiline === true) { if ($indent === "_auto") { $indent = str_repeat(" ", strlen($tag["qname"]) + 2); } } // create attribute list $attList = XML_Util::attributesToString($tag["attributes"], true, $multiline, $indent, $linebreak); if (!isset($tag["content"]) || (string) $tag["content"] == '') { $tag = sprintf("<%s%s />", $tag["qname"], $attList); } else { if ($replaceEntities == PEAR_PackageFile_Generator_v2_XML_Util_REPLACE_ENTITIES) { $tag["content"] = PEAR_PackageFile_Generator_v2_XML_Util::replaceEntities($tag["content"], $encoding); } elseif ($replaceEntities == PEAR_PackageFile_Generator_v2_XML_Util_CDATA_SECTION) { $tag["content"] = XML_Util::createCDataSection($tag["content"]); } $tag = sprintf("<%s%s>%s</%s>", $tag["qname"], $attList, $tag["content"], $tag["qname"]); } return $tag; }
/** * Start tag handler * * @param resource $parser * reference to parser resource * @param string $fullname * element name * @param array $attrs * array of attributes * @return none */ function startTag($parser, $fullname, $attrs) { $nSpaces = array(); foreach ($attrs as $atn => $atv) { $a = XML_Util::splitQualifiedName($atn); $atns = $a['namespace']; $atnm = $a['localPart']; unset($attrs[$atn]); if ($atns == 'xmlns') { $nSpaces[$atnm] = $atv; } else { if ($atns == NULL && $atnm == 'xmlns') { $nSpaces[''] = $atv; } else { $attrs[$atn] = new XmlAttrib($atns, $atnm, $atv); } } } $el = new XmlElement($fullname, $attrs, $nSpaces); array_push($this->stack, $el); }
/** * SAX callback for 'endElement' event. * * @param resource * @param string * @access private */ function _endElement($parser, $element) { $cdata = $this->_cdataStack[$this->_level]; $element = $this->canonicalize($element); $qElement = XML_Util::splitQualifiedName($element, '&MAIN'); $process = $this->_lastProcessed != $element; $recursion = FALSE; if ($process && isset($this->_callbackRegistry->overloadedNamespaces[$qElement['namespace']]['active'])) { // The event is handled by a callback // that is registered for this namespace. $result = $this->_callbackRegistry->overloadedNamespaces[$qElement['namespace']]['object']->endElement($qElement['localPart'], $cdata); if (is_array($result)) { $cdata =& $result[0]; $reparse = $result[1]; } else { $cdata =& $result; $reparse = TRUE; } $recursion = $reparse && isset($this->_elementStack[$this->_level - 1]) && $this->_callbackRegistry->overloadedNamespaces[$qElement['namespace']]['recursiveOperation']; } else { // No callback was registered for this element's // closing tag, copy it. $cdata .= '</' . $element . '>'; } if ($recursion) { // Recursively process this transformation's result. if ($this->_checkDebug('&RECURSE')) { $this->sendMessage(sprintf('start recursion[%d]: %s', $this->_level, $cdata)); } $transformer = new XML_Transformer(array('callbackRegistry' => &$this->_callbackRegistry, 'caseFolding' => $this->_caseFolding, 'caseFoldingTo' => $this->_caseFoldingTo, 'lastProcessed' => $element)); $cdata = substr($transformer->transform("<_>{$cdata}</_>"), 3, -4); if ($this->_checkDebug('&RECURSE')) { $this->sendMessage(sprintf('end recursion[%d]: %s', $this->_level, $cdata)); } } if ($this->_checkDebug($element)) { $this->sendMessage(sprintf('endElement[%d]: %s (with cdata=%s)', $this->_level, $element, $this->_cdataStack[$this->_level])); } // Move result of this transformation step to // the parent's CDATA section. $this->_cdataStack[--$this->_level] .= $cdata; }