Как я могу изменить пространство имен на каждом узле в DOM?

Ну, если Вы смотрите на то, что продолжается, относительно выборов, обновлений, удаляет, и так далее, существует несколько представлений в pg_catalog схема, я главным образом использую pg_stat_user_tables и pg_stat_user_indexes, но существует намного больше, все в pg_stat*.

также существует эти pg_stat_activity представление, которое говорит Вам, что работает на Вашем сервере прямо сейчас.

я взломал вместе четыре munin плагина, который использует user_tables и user_indexes, они доступны там

5
задан Chris R 22 August 2009 в 19:17
поделиться

6 ответов

Исходя из моего крайне предвзятого мнения, то, что вы хотите, будет огромной занозой в заднице. Я уже вижу ад приведения типов и многочисленные рекурсивные циклы for, необходимые для этого надежно! Ах, реализация Java по умолчанию, как я ненавижу ваши NPE: внутренности, обратную логику, дополнительные шаги, необходимые для простых операций!

Итак, да, мое предложение было бы рекурсивным для циклов с приведением типов для каждого отдельного возможного типа узла, исходя из моего личного опыта, реализация Java по умолчанию - отстой.

3
ответ дан 18 December 2019 в 09:08
поделиться

Это неэффективно для DOM, поддерживающего пространство имен. Вам нужно будет использовать метод DOM Level 3 Core Document.renameNode ( javadoc ) для каждого дочернего элемента, пространство имен которого вы хотите изменить. (Обычно вам не нужно менять так много узлов Attr, потому что пространство имен узла Attr без префикса всегда равно null, а не пространство имен Element.)

Если все, что вы хотите сделать, это заменить одно пространство имен другим , может быть быстрее использовать модель DOM, не зависящую от пространства имен, и просто изменить соответствующий атрибут xmlns. Вы должны иметь возможность получить DOM, не зависящую от пространства имен, установив для параметра DOMConfiguration 'namespaces' значение false, но я не пробовал это в Java, и это '

10
ответ дан 18 December 2019 в 09:08
поделиться

Если намерение состоит в том, чтобы просто изменить пространство имен, тогда просто используйте какой-нибудь редактор потока, чтобы изменить отображение NS на URL.

Namspace - это более или менее привязка между префиксом пространства имен и URI. Чтобы быстро изменить пространство имен, просто измените отображение:

До: xmlns: myNS = "my-namespace-uri"

После: xmlns: myNS = "my-new-namespace-uri"

В основном изменение сопоставления достаточно, если намерение состоит в том, чтобы просто изменить пространство имен. Более того, если XML-документ имеет пространство имен по умолчанию, то изменение значения URL-адреса пространства имен по умолчанию изменит пространство имен для всего документа.

До: xmlns = "my-namespace-uri"

После: xmlns = "my-new-namespace-uri"

2
ответ дан 18 December 2019 в 09:08
поделиться

Как я могу, учитывая w3c DOM (в частности, реализацию Java по умолчанию), изменить пространство имен каждого элемента / атрибута / узла в этой DOM? Желательно эффективно.

Я не думаю, что есть эффективное решение, которое также было бы надежным. Вы не можете просто переименовать что-то в корневом элементе. Рассмотрим следующие документы:

Doc1

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="urn:all" xmlns:f="urn:fleet" xmlns:m="urn:mission">
  <f:starfleet>
    <m:bold>
      <f:ship name="Enterprise" />
    </m:bold>
  </f:starfleet>
</root>

Doc2

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="urn:all">
  <starfleet xmlns="urn:fleet">
    <bold xmlns="urn:mission">
      <ship xmlns="urn:fleet" name="Enterprise" />
    </bold>
  </starfleet>
</root>

Doc3

<?xml version="1.0" encoding="UTF-8"?>
<r:root xmlns:r="urn:all">
  <r:starfleet xmlns:r="urn:fleet">
    <r:bold xmlns:r="urn:mission">
      <r:ship xmlns:r="urn:fleet" name="Enterprise" />
    </r:bold>
  </r:starfleet>
</r:root>

Эти три документа эквивалентны в модели DOM, учитывающей пространство имен. Вы можете запустить те же запросы XPath с пространством имен для любого из них.

Поскольку DOM позволяет вам точно указать, как узлы должны быть расположены в пространстве имен, нет универсального одношагового вызова для изменения пространство имен. Вам необходимо пройтись по DOM, принимая во внимание не только значения префикса и URI, но и их область в любой момент времени.

Этот XSLT можно использовать с преобразователем для изменения элементов, имеющих пространство имен как urn: fleet , которые будут размещены в пространстве имен как urn: new :

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:f="urn:fleet" version="1.0">
  <xsl:output method="xml" indent="yes" />
  <xsl:template match="*">
    <xsl:copy>
      <xsl:copy-of select="@*" />
      <xsl:apply-templates />
    </xsl:copy>
  </xsl:template>
  <xsl:template match="f:*">
    <xsl:variable name="var.foo" select="local-name()" />
    <xsl:element namespace="urn:new" name="{$var.foo}">
      <xsl:copy-of select="@*" />
      <xsl:apply-templates />
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>

Предостережения: потребуется дальнейшая настройка для обработки атрибутов пространства имен; dangling urn: fleet объявления могут быть оставлены позади, что беспорядочно, но в значительной степени несущественно; возможно, другие вещи, о которых я не думал.

2
ответ дан 18 December 2019 в 09:08
поделиться

Пространство имен изменяется для каждого элемента без определенного префикса пространства имен путем применения атрибута targetnamespace к корневому элементу. Для этого также потребуется, чтобы вы затем изменили каждый из ваших элементов с помощью префикса пространства имен. Вы можете изменить этот префикс вручную или написать логику сценария для обхода вашего DOM-дерева и применения его только там, где это необходимо.

Подробнее об атрибуте targetnamespace и атрибуте nonamespaceschema:

http: //www.xml .com / pub / a / 2000/11/29 / schemas / part1.html? page = 8 http://www.computerpoweruser.com/editorial/article.asp?article=articles%2Farchive%2Fc0407%2F48c07 % 2F48c07.asp

0
ответ дан 18 December 2019 в 09:08
поделиться

Вы можете скопировать свое дерево DOM в другое дерево и внести некоторые изменения в процессе. Например, используя org.apache.xml.utils.DOMBuilder в качестве реализации ContentHandler, вы можете переопределить методы таким образом:

public void startElement(String ns, String localName, String name, Attributes atts) throws SAXException {
        super.startElement("new_namespace", localName, name, atts);
    }

DOMBuilder выполнит всю грязную работу во время копирования, оставив вам только логику замены пространства имен.

0
ответ дан 18 December 2019 в 09:08
поделиться
Другие вопросы по тегам:

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