2015-03-31 121 views
1

连字符的所有元素的名称和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"> 
+0

为什么?你不需要它来解析你的xml。 – EZI 2015-03-31 19:03:41

+0

我实际上将这个xml解析为动态对象,当名称包含连字符时属性不起作用,所以我想先用下划线替换所有连字符,然后将其解析为动态对象。 – user2818430 2015-03-31 19:05:21

+0

'我实际解析这个XML到动态对象'你能发布代码吗? – EZI 2015-03-31 19:08:12

回答

1

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

0
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(); 
     } 
    }