оператор присваивания vs assign () в строках C ++ [duplicate]

Существует много способов обработки HTML / XML DOM, о которых большинство уже упоминалось. Следовательно, я не буду пытаться их перечислить.

Я просто хочу добавить, что лично я предпочитаю использовать расширение DOM и почему:

  • iit делает оптимальным использование преимущественного преимущества базового кода C
  • - это OO PHP (и позволяет мне подклассифицировать его)
  • , это довольно низкий уровень (что позволяет мне использовать его как не- раздутый фундамент для более продвинутого поведения)
  • предоставляет доступ ко всем частям DOM (в отличие от, например, SimpleXml, который игнорирует некоторые из менее известных функций XML)
  • имеет синтаксис используемый для обхода DOM, который аналогичен синтаксису, используемому в собственном Javascript.

И хотя я пропускаю возможность использования селекторов CSS для DOMDocument, существует довольно простой и удобный способ добавления эта функция: подклассификация DOMDocument и добавление JS-подобных методов querySelectorAll и querySelector в ваш подкласс.

Для разбора селекторов я рекомендую использовать очень минималистический компонент CssSelector из рамки Symfony , Этот компонент просто переводит селектора CSS в селектора XPath, которые затем могут быть загружены в DOMXpath для получения соответствующего Nodelist.

Затем вы можете использовать этот (еще очень низкий уровень) подкласс в качестве основы для более классы высокого уровня, предназначенные, например. проанализируйте очень специфические типы XML или добавьте больше поведение, подобное jQuery.

Ниже приведен код моей библиотеки DOM-Query и использует описанную вами технику.

Для синтаксического анализа HTML:

namespace PowerTools;

use \Symfony\Component\CssSelector\CssSelector as CssSelector;

class DOM_Document extends \DOMDocument {
    public function __construct($data = false, $doctype = 'html', $encoding = 'UTF-8', $version = '1.0') {
        parent::__construct($version, $encoding);
        if ($doctype && $doctype === 'html') {
            @$this->loadHTML($data);
        } else {
            @$this->loadXML($data);
        }
    }

    public function querySelectorAll($selector, $contextnode = null) {
        if (isset($this->doctype->name) && $this->doctype->name == 'html') {
            CssSelector::enableHtmlExtension();
        } else {
            CssSelector::disableHtmlExtension();
        }
        $xpath = new \DOMXpath($this);
        return $xpath->query(CssSelector::toXPath($selector, 'descendant::'), $contextnode);
    }

    [...]

    public function loadHTMLFile($filename, $options = 0) {
        $this->loadHTML(file_get_contents($filename), $options);
    }

    public function loadHTML($source, $options = 0) {
        if ($source && $source != '') {
            $data = trim($source);
            $html5 = new HTML5(array('targetDocument' => $this, 'disableHtmlNsInDom' => true));
            $data_start = mb_substr($data, 0, 10);
            if (strpos($data_start, '') === 0) {
                $html5->loadHTML($data);
            } else {
                @$this->loadHTML('');
                $t = $html5->loadHTMLFragment($data);
                $docbody = $this->getElementsByTagName('body')->item(0);
                while ($t->hasChildNodes()) {
                    $docbody->appendChild($t->firstChild);
                }
            }
        }
    }

    [...]
}

См. также Анализ XML-документов с помощью селекторов CSS создателем Symfony Фабьеном Потенцером по его решению создать компонент CssSelector для Symfony и как используйте его.

2
задан malarres 10 December 2015 в 08:30
поделиться

1 ответ

Оба одинаково быстры, но = "..." понятнее.

Если вы действительно хотите быстро, используйте assign и укажите размер:

test2.assign("Hello again", sizeof("Hello again"));
// or
test2.assign("Hello again", 12);

Таким образом , требуется только одно распределение. (Вы также могли .reserve() получить достаточно памяти, чтобы получить тот же эффект.)

5
ответ дан emlai 26 August 2018 в 02:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: