Добавить элемент в XML - PullRequest
0 голосов
/ 29 мая 2019

Я хочу добавить элемент (соединитель) в существующий XML, это было успешно, но мне нужно удалить xmlns= и добавить к нему значение. Блейт разъема дополнен моим кодом.

XML:

<?xml version="1.0"?>
<configuration xmlns="urn:activemq" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="urn:activemq /schema/artemis-configuration.xsd">
  <core xmlns="urn:activemq:core" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:activemq:core ">
    <connectors>
      <!-- Connector used to be announced through cluster connections and notifications -->
      <connector name="artemis">tcp://xxxxxxx:61616</connector>
      <connector name="blaat" xmlns="" />
    </connectors>
  </core>
</configuration>
[xml]$xml = Get-Content d:\data\test-broker\etc\broker.xml

$xml.configuration.core.connectors.connector.ChildNodes.Item(0).value

$Node = $xml.CreateElement("connector");
$Node.SetAttribute("name", "blaat");
$xml.configuration.core.connectors.AppendChild($node)
$xml.configuration.core.connectors.connector.SetValue("tcp://");
$xml.Save("d:\data\test-broker\etc\broker.xml")

Я хочу, чтобы XML был таким:

<?xml version="1.0"?>
<configuration xmlns="urn:activemq" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="urn:activemq /schema/artemis-configuration.xsd">
  <core xmlns="urn:activemq:core" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:activemq:core ">
    <connectors>
      <!-- Connector used to be announced through cluster connections and notifications -->
      <connector name="artemis">tcp://xxxx1:61616</connector>
      <connector name="blaat">tcp://xxxxx2:61616</connector>
    </connectors>
  </core>
</configuration>

1 Ответ

1 голос
/ 29 мая 2019

Ваши данные XML используют пространства имен, поэтому вам нужно позаботиться об этом.Узел <core> определяет пространство имен по умолчанию (xmlns="urn:activemq:core"), которое применяется ко всем его дочерним узлам.Создайте менеджер пространства имен и добавьте в него это пространство имен:

$nm = New-Object Xml.XmlNamespaceManager $xml.NameTable
$nm.AddNamespace('foo', 'urn:activemq:core')

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

$cn = $xml.SelectSingleNode('//foo:connectors', $nm)

При создании нового узла укажите его по умолчаниюпространство имен, затем установите атрибуты и значение узла:

$node = $xml.CreateElement('connector', $cn.NamespaceURI)
$node.SetAttribute('name', 'blaat')
$node.InnerText = 'tcp://xxxxx2:61616'

Теперь вы можете добавить новый узел к предполагаемому родителю, не получая ложный атрибут xmlns:

[void]$cn.AppendChild($node)
...