Как создать атрибуты XmlElement с префиксом? - PullRequest
9 голосов
/ 13 февраля 2010

Мне нужно иметь возможность определить атрибут с префиксом в элементе xml.

Например ...

<nc:Person s:id="ID_Person_01"></nc:Person>

Чтобы сделать это, я думаю, что следующеесработало бы.

XmlElement TempElement = XmlDocToRef.CreateElement("nc:Person", "http://niem.gov/niem/niem-core/2.0");
TempElement.SetAttribute("s:id", "http://niem.gov/niem/structures/2.0", "ID_Person_01");

К сожалению, XmlElement.SetAttribute (строка, строка, строка) не поддерживает синтаксический анализ префикса, так как я получаю сообщение об ошибке ниже.

Символ ':', шестнадцатеричное значение 0x3A, нельзя включить в имя.

Как определить атрибут с префиксом?

Ответы [ 4 ]

20 голосов
/ 13 февраля 2010

Если вы уже объявили свое пространство имен в корневом узле, вам просто нужно изменить вызов SetAttribute, чтобы использовать имя атрибута без префикса. Поэтому, если ваш корневой узел определяет пространство имен следующим образом:

<People xmlns:s='http://niem.gov/niem/structures/2.0'>

Вы можете сделать это, и атрибут получит префикс, который вы уже установили:

// no prefix on the first argument - it will be rendered as
// s:id='ID_Person_01'
TempElement.SetAttribute("id", "http://niem.gov/niem/structures/2.0", "ID_Person_01");

Если вы еще не объявили пространство имен (и его префикс), перегрузка из трех строк XmlDocument.CreateAttribute сделает это за вас:

// Adds the declaration to your root node
var attribute = xmlDocToRef.CreateAttribute("s", "id", "http://niem.gov/niem/structures/2.0");
attribute.InnerText = "ID_Person_01"
TempElement.SetAttributeNode(attribute);
2 голосов
/ 13 февраля 2010

Метод XMLDocument.CreateAttribute может принимать 3 строки: указанный префикс, LocalName и NamespaceURI. Затем вы можете добавить атрибут к элементу. Нечто подобное может работать для вас:

XmlAttribute newAttribute = XmlDocToRef.CreateAttribute("s", "id", "http://niem.gov/niem/structures/2.0");
TempElement.Attributes.Append(newAttribute):
1 голос
/ 13 февраля 2010

Попробуйте создать атрибут напрямую и добавить его к элементу:

XmlAttribute attr = XmlDocToRef.CreateAttribute("s", "id", "http://niem.gov/niem/structures/2.0");
attr.InnerText = "ID_Person_01";
TempElement.Attributes.Append(attr);
0 голосов
/ 05 августа 2011

Так как мой поиск продолжал приводить меня сюда, я отвечу на это XElement. Я не знаю, подходит ли это решение и для XmlElement, но, надеюсь, оно хотя бы поможет другим, использующим XElement, которые в итоге окажутся здесь.

На основании этого я добавил xml:space="preserve" ко всем узлам данных в некотором шаблоне, прежде чем искать и добавлять их содержимое. Это странный код IMO (я бы предпочел три параметра, как показано выше, но он выполняет свою работу:

 foreach (XElement lElement in root.Descendants(myTag))
 {
      lElement.Add(new XAttribute(root.GetNamespaceOfPrefix("xml") + "space", "preserve"));
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...