替换包含下划线
问题描述:
连字符的所有元素的名称和attrbiutes我有下面的XML例子:替换包含下划线
<root-name file="something" date="22.02.2015" target="name" full-name="something else">
<root-child title ="title" published-by="FullName" published-by-userid="username">
<root-doc id="123" owner-id="username" />
<root-doc id="1234" owner-id="username" />
<root-doc id="12345" owner-id="username" />
</root-child>
<root-child title ="title" published-by="FullName" published-by-userid="username">
<root-doc id="abc" owner-id="username" />
<root-doc id="abcd" owner-id="username" />
<root-doc id="abcde" owner-id="username" />
</root-child>
..................
</root-name>
我怎么能代替所有元素的名称和包含连字符强调属性?
例子:
<root-name file="something" date="22.02.2015" target="name" full-name="something else">
应该
<root_name file="something" date="22.02.2015" target="name" full_name="something else">
答
Attributes names比元素名称麻烦一点,因为属性名称没有制定者。因此:
var doc = XDocument.Parse(xml);
foreach (var element in doc.Descendants())
{
if (element.Name.LocalName.Contains("-"))
{
var newName = element.Name.LocalName.Replace('-', '_');
element.Name = element.Name.Namespace + newName;
}
var list = element.Attributes().ToList();
for (int i = 0; i < list.Count; i++)
{
var attr = list[i];
if (attr.Name.LocalName.Contains("-"))
{
XAttribute newAttr = new XAttribute(attr.Name.Namespace + attr.Name.LocalName.Replace('-', '_'), attr.Value);
list[i] = newAttr;
}
}
element.ReplaceAttributes(list);
}
+0
不错的一个。谢谢! – user2818430 2015-03-31 19:15:06
答
static void Main(string[] args)
{
XDocument xdoc = XDocument.Parse(System.IO.File.ReadAllText("F:\\save.xml"));
xdoc.Descendants().All(m => { Replace(m); return true; });
Console.Write(xdoc.ToString());
Console.Read();
}
static void Replace(XElement node)
{
if (node.Name.LocalName.IndexOf("-") > -1)
{
node.Name = node.Name.LocalName.Replace('-', '_');
}
node.Attributes().All(m => { Replace(m); return true;});
}
static void Replace(XAttribute node)
{
if (node.Name.LocalName.IndexOf("-") > -1)
{
XAttribute xa = new XAttribute(node.Name.LocalName.Replace('-', '_'), node.Value);
node.Parent.Add(xa);
node.Remove();
}
}
为什么?你不需要它来解析你的xml。 – EZI 2015-03-31 19:03:41
我实际上将这个xml解析为动态对象,当名称包含连字符时属性不起作用,所以我想先用下划线替换所有连字符,然后将其解析为动态对象。 – user2818430 2015-03-31 19:05:21
'我实际解析这个XML到动态对象'你能发布代码吗? – EZI 2015-03-31 19:08:12