开发者

How to create XmlElement attributes with prefix?

开发者 https://www.devze.com 2022-12-20 05:10 出处:网络
I need to be able to define an attribute with a prefix in a xml element. For instance... <nc:Person s:id=\"ID_Person_01\"></nc:Person>

I need to be able to define an attribute with a prefix in a xml element.

For instance...

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

In order to do this I though that the following would have worked.

XmlElement TempElement = XmlDocToRef.CreateElement("nc:Person", "http://niem.gov/niem/niem-core/2开发者_C百科.0");
TempElement.SetAttribute("s:id", "http://niem.gov/niem/structures/2.0", "ID_Person_01");

Unfortunately, XmlElement.SetAttribute(string, string, string) does not seem to support parsing the prefix as I receive the error below.

The ':' character, hexadecimal value 0x3A, cannot be included in a name.

How would I define an attribute with prefix?


If you've already declared your namespace in the root node, you just need to change the SetAttribute call to use the unprefixed attribute name. So if your root node defines a namespace like this:

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

You can do this and the attribute will pick up the prefix you've already established:

// 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");

If you have not yet declared the namespace (and its prefix), the three-string XmlDocument.CreateAttribute overload will do it for you:

// 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);


The XMLDocument.CreateAttribute method can take 3 strings: specified Prefix, LocalName, and NamespaceURI. You could then add the attribute to the element. Something like this might work for you:

XmlAttribute newAttribute = XmlDocToRef.CreateAttribute("s", "id", "http://niem.gov/niem/structures/2.0");
TempElement.Attributes.Append(newAttribute):


Try creating the attribute directly and adding it to the element:

XmlAttribute attr = XmlDocToRef.CreateAttribute("s", "id", "http://niem.gov/niem/structures/2.0");
attr.InnerText = "ID_Person_01";
TempElement.Attributes.Append(attr);


Since my search kept taking me here, I'll answer this for XElement. I don't know if this solution is also valid for XmlElement, but it will hopefully at least help others using XElement, who end up here.

Based on this I added xml:space="preserve" to all data-nodes in some template, before looking up and adding their contents. It's weird code IMO (I would prefer three parameters as shown above, but it does the job:

 foreach (XElement lElement in root.Descendants(myTag))
 {
      lElement.Add(new XAttribute(root.GetNamespaceOfPrefix("xml") + "space", "preserve"));
 }
0

精彩评论

暂无评论...
验证码 换一张
取 消