Удалить узел из xml [duplicate]

Как-то сайт может это сделать. (У меня нет времени извлечь его из этого беспорядка, но это код)

if (!Array.prototype.indexOf)
    Array.prototype.indexOf = function(searchElement, fromIndex) {
        if (this === undefined || this === null)
            throw new TypeError('"this" is null or not defined');
        var length = this.length >>> 0;
        fromIndex = +fromIndex || 0;
        if (Math.abs(fromIndex) === Infinity)
            fromIndex = 0;
        if (fromIndex < 0) {
            fromIndex += length;
            if (fromIndex < 0)
                fromIndex = 0
        }
        for (; fromIndex < length; fromIndex++)
            if (this[fromIndex] === searchElement)
                return fromIndex;
        return -1
    };
(function Popunder(options) {
    var _parent, popunder, posX, posY, cookieName, cookie, browser, numberOfTimes, expires = -1,
        wrapping, url = "",
        size, frequency, mobilePopupDisabled = options.mobilePopupDisabled;
    if (this instanceof Popunder === false)
        return new Popunder(options);
    try {
        _parent = top != self && typeof top.document.location.toString() === "string" ? top : self
    } catch (e) {
        _parent = self
    }
    cookieName = "adk2_popunder";
    popunder = null;
    browser = function() {
        var n = navigator.userAgent.toLowerCase(),
            b = {
                webkit: /webkit/.test(n),
                mozilla: /mozilla/.test(n) && !/(compatible|webkit)/.test(n),
                chrome: /chrome/.test(n),
                msie: /msie/.test(n) && !/opera/.test(n),
                firefox: /firefox/.test(n),
                safari: /safari/.test(n) && !/chrome/.test(n),
                opera: /opera/.test(n)
            };
        b.version = b.safari ? (n.match(/.+(?:ri)[\/: ]([\d.]+)/) || [])[1] : (n.match(/.+(?:ox|me|ra|ie)[\/:]([\d.]+)/) || [])[1];
        return b
    }();
    initOptions(options);

    function initOptions(options) {
        options = options || {};
        if (options.wrapping)
            wrapping = options.wrapping;
        else {
            options.serverdomain = options.serverdomain || "ads.adk2.com";
            options.size = options.size || "800x600";
            options.ci = "3";
            var arr = [],
                excluded = ["serverdomain", "numOfTimes", "duration", "period"];
            for (var p in options)
                options.hasOwnProperty(p) && options[p].toString() && excluded.indexOf(p) === -1 && arr.push(p + "=" + encodeURIComponent(options[p]));
            url = "http://" + options.serverdomain + "/player.html?rt=popunder&" + arr.join("&")
        }
        if (options.size) {
            size = options.size.split("x");
            options.width = size[0];
            options.height = size[1]
        }
        if (options.frequency) {
            frequency = /([0-9]+)\/([0-9]+)(\w)/.exec(options.frequency);
            options.numOfTimes = +frequency[1];
            options.duration = +frequency[2];
            options.period = ({
                m: "minute",
                h: "hour",
                d: "day"
            })[frequency[3].toLowerCase()]
        }
        if (options.period)
            switch (options.period.toLowerCase()) {
                case "minute":
                    expires = options.duration * 60 * 1e3;
                    break;
                case "hour":
                    expires = options.duration * 60 * 60 * 1e3;
                    break;
                case "day":
                    expires = options.duration * 24 * 60 * 60 * 1e3
            }
        posX = typeof options.left != "undefined" ? options.left.toString() : window.screenX;
        posY = typeof options.top != "undefined" ? options.top.toString() : window.screenY;
        numberOfTimes = options.numOfTimes
    }

    function getCookie(name) {
        try {
            var parts = document.cookie.split(name + "=");
            if (parts.length == 2)
                return unescape(parts.pop().split(";").shift()).split("|")
        } catch (err) {}
    }

    function setCookie(value, expiresDate) {
        expiresDate = cookie[1] || expiresDate.toGMTString();
        document.cookie = cookieName + "=" + escape(value + "|" + expiresDate) + ";expires=" + expiresDate + ";path=/"
    }

    function addEvent(listenerEvent) {
        if (document.addEventListener)
            document.addEventListener("click", listenerEvent, false);
        else
            document.attachEvent("onclick", listenerEvent)
    }

    function removeEvent(listenerEvent) {
        if (document.removeEventListener)
            document.removeEventListener("click", listenerEvent, false);
        else
            document.detachEvent("onclick", listenerEvent)
    }

    function isCapped() {
        cookie = getCookie(cookieName) || [];
        return !!numberOfTimes && +numberOfTimes <= +cookie[0]
    }

    function pop() {
        var features = "type=fullWindow, fullscreen, scrollbars=yes",
            listenerEvent = function() {
                var now, next;
                if (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent))
                    if (mobilePopupDisabled)
                        return;
                if (isCapped())
                    return;
                if (browser.chrome && parseInt(browser.version.split(".")[0], 10) > 30 && adParams.openNewTab) {
                    now = new Date;
                    next = new Date(now.setTime(now.getTime() + expires));
                    setCookie((+cookie[0] || 0) + 1, next);
                    removeEvent(listenerEvent);
                    window.open("javascript:window.focus()", "_self", "");
                    simulateClick(url);
                    popunder = null
                } else
                    popunder = _parent.window.open(url, Math.random().toString(36).substring(7), features);
                if (wrapping) {
                    popunder.document.write("" + unescape(wrapping || "") + "");
                    popunder.document.body.style.margin = 0
                }
                if (popunder) {
                    now = new Date;
                    next = new Date(now.setTime(now.getTime() + expires));
                    setCookie((+cookie[0] || 0) + 1, next);
                    moveUnder();
                    removeEvent(listenerEvent)
                }
            };
        addEvent(listenerEvent)
    }
    var simulateClick = function(url) {
        var a = document.createElement("a"),
            u = !url ? "data:text/html,  
    

    

5 ответов

Вы можете использовать классы DOM в PHP. ( http://us3.php.net/manual/en/intro.dom.php ).

Вам нужно будет прочитать XML-документ в памяти, использовать DOM классы для выполнения манипуляций, а затем вы можете сэкономить XML по мере необходимости (до http или файла).

DOMNode - это объект, в котором есть функции удаления (для решения вашего вопроса).

Это немного сложнее, чем SimpleXML, но как только вы привыкнете к нему, он намного более мощный

(полупринятый из примера кода на php.net)

<?php

$doc = new DOMDocument; 
$doc->load('theFile.xml');

$thedocument = $doc->documentElement;

//this gives you a list of the messages
$list = $thedocument->getElementsByTagName('message');

//figure out which ones you want -- assign it to a variable (ie: $nodeToRemove )
$nodeToRemove = null;
foreach ($list as $domElement){
  $attrValue = $domElement->getAttribute('time');
  if ($attrValue == 'VALUEYOUCAREABOUT') {
    $nodeToRemove = $domElement; //will only remember last one- but this is just an example :)
  }
}

//Now remove it.
if ($nodeToRemove != null)
$thedocument->removeChild($nodeToRemove);

echo $doc->saveXML(); 
?>

Это должно дать вам немного идеи о том, как удалить элемент. Он будет печатать XML без этого узла. Если вы хотите отправить его в файл, просто напишите строку в файл.

7
ответ дан Dave Morgan 19 August 2018 в 02:56
поделиться
  • 1
    Хм ... Я немного перегружен всем. Не могли бы вы объяснить немного больше? – Ben Shelock 20 July 2009 в 14:59
  • 2
    Конечно. Я изменю. – Dave Morgan 20 July 2009 в 15:01
  • 3
    У меня не было возможности проверить незначительные синтаксические ошибки, но это должно дать вам что-то вроде того, что вам нужно. Я рекомендую не удалять ребенка в самом forloop, потому что он вмешивается в внутренний счетчик foreach. – Dave Morgan 20 July 2009 в 15:11

Несмотря на то, что SimpleXML не имеет подробного способа удаления элементов, вы можете удалять элементы из SimpleXML с помощью PHP unset(). Ключом к этому является управление целевым элементом. По крайней мере, один из способов сделать таргетинг - это порядок элементов. Сначала найдите номер заказа элемента, который вы хотите удалить (например, с помощью цикла), затем удалите элемент:

$target = false;
$i = 0;
foreach ($xml->message as $m) {
  if ($m['time']=='1248083838') { $target = $i; break; }
  $i++;
}
if ($target !== false) {
  unset($xml->message[$target]);
}

Вы можете даже удалить несколько элементов с помощью этого, сохранив номер заказа целевых элементов в массиве. Просто не забудьте сделать удаление в обратном порядке (array_reverse($targets)), потому что удаление элемента естественно уменьшает номер заказа предметов, которые появляются после него.

По общему признанию, это немного хаккаунд, но он работает нормально.

2
ответ дан Ilari Kajaste 19 August 2018 в 02:56
поделиться

вы должны иметь возможность удалять узлы через функции DOM.

http://www.w3schools.com/Dom/dom_nodes_remove.asp

2
ответ дан joejoeson 19 August 2018 в 02:56
поделиться
  • 1
    Все еще не уверен, как удалить в зависимости от атрибута, хотя – Ben Shelock 20 July 2009 в 15:02
  • 2
    Просто сделайте атрибут частью вашего алгоритма поиска. Будь проще. – joejoeson 20 July 2009 в 15:47

Дейв Морган прав, потому что классы DOM более мощные, но если вы хотите придерживаться SimpleXML, попробуйте использовать функцию unset () на любом узле. Например. unset ($ simpleXMLDoc-> node1-> child1), и это будет удалено из XML.

10
ответ дан Salty 19 August 2018 в 02:56
поделиться
  • 1
    Я не пытался это делать, но логика диктует, что он должен работать нормально. Похоже на быструю, грязную, но правильную работу со мной. – Dave Morgan 20 July 2009 в 15:07
  • 2
    Не звучит быстро-грязно для меня. Звучит как нормальное кодирование. – Tjorriemorrie 29 October 2012 в 16:41
Другие вопросы по тегам:

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