Следующие регулярные выражения будут соответствовать всем запятым, которые присутствуют вне двойных кавычек,
,(?=(?:[^"]*"[^"]*")*[^"]*$)
ИЛИ (только для PCRE)
"[^"]*"(*SKIP)(*F)|,
"[^"]*"
соответствует всем блокам с двойными кавычками. То есть в этом входе buz,"bar,foo"
это регулярное выражение будет соответствовать только "bar,foo"
. Теперь следующий (*SKIP)(*F)
делает совпадение неудачным. Затем он переходит к шаблону, который был рядом с символом |
и пытается совместить символы с оставшейся строкой. То есть в нашем выходе ,
рядом с шаблоном |
будет соответствовать только запятая, которая была сразу после buz
. Обратите внимание, что это не будет соответствовать запятой, которая присутствовала внутри двойных кавычек, потому что мы уже пропустили пропущенную двойную кавычку.
. Следующее регулярное выражение будет соответствовать всем запятым, которые присутствуют внутри двойных кавычек,
,(?!(?:[^"]*"[^"]*")*[^"]*$)
Я считаю, что это просто вопрос установки соответствующего атрибута непосредственно на корневом узле. Вот пример программы:
using System;
using System.Globalization;
using System.Xml;
class Test
{
static void Main()
{
XmlDocument doc = new XmlDocument();
XmlElement root = doc.CreateElement("root");
string ns = "http://sample/namespace";
XmlAttribute nsAttribute = doc.CreateAttribute("xmlns", "xx",
"http://www.w3.org/2000/xmlns/");
nsAttribute.Value = ns;
root.Attributes.Append(nsAttribute);
doc.AppendChild(root);
XmlElement child = doc.CreateElement("child");
root.AppendChild(child);
XmlAttribute newAttribute = doc.CreateAttribute("xx","abc", ns);
newAttribute.Value = "ddd";
child.Attributes.Append(newAttribute);
doc.Save(Console.Out);
}
}
Вывод:
<?xml version="1.0" encoding="ibm850"?>
<root xmlns:xx="http://sample/namespace">
<child xx:abc="ddd" />
</root>