2012-05-17 59 views
0

所以我正在寻找一种方法来编辑XML文件中的单个元素描述。使用XElement编辑属性名称

例如,说我有:

1 <stack id ="1">Stack1</stack> 
2 <book id="EG-FE">This Book</book> 
3 <book id="EG-FF">That Book</book> 
4 <book id="FE-GT">Another Book</book> 
5 <book id="JL-01">Invalid Book Id</book> 
6 <stack id="2">Stack2</stack> 

你会发现这本书第5行有一个奇怪的格式...的ID的第二部分(后“ - ”)的数字,其中其余的人都有信件。我怎么会去删除书5的id的只是“-01”的一部分(即其更改为:?

5 <book id="JL">Valid Book Id</book> 

,而无需修改ENY其他元素(IE堆栈)

这里是我的“M尝试:

using System.Xml.Linq 

XElement books = XElement.Load("{file}"); 

string _Attribute; 
foreach (var bookID in books.Nodes()) 
{ 
    if(bookID.Attribute("book")) 
    { 
     _Attribute = bookID.Attribute("book") 
     if(!Regex.IsMatch(_Attribute., @"^[a-zA-Z-]+$"); 
     { 
      Regex.Replace(_Attribute, @"\d", ""); 
     } 
     bookID.Attribute("book") = _Attribute; 
    } 
} 

显然,这是可怕的错误......关于如何解决它的任何想法

谢谢

?! 210

我没有找到太多的帮助直接处理这个问题,我试图放在一起的零碎并没有真正的帮助。

回答

2
using System.Xml.Linq 

XElement books = XElement.Load("{file}"); 

string _Attribute; 
foreach (var bookID in books.Elements("book")) 
{ 
    if(bookID.Attribute("id") != null) 
    { 
     _Attribute = bookID.Attribute("book").Value; 
     if(!Regex.IsMatch(_Attribute, @"-[0-9]+$")) 
     { 
      Regex.Replace(_Attribute, @"-[0-9]+$", ""); 
     } 
     bookID.Attribute("id").Value = _Attribute; 
    } 
} 

未经检验和所有那些平常的意见。修正了关于Linq到XML如何工作的一些假设,并使正则表达式检查了解它是否以数字结尾并在此情况下替换最后的数字。

+0

因此,我很难找出如何得到元素名称...我能找到的所有帮助都是获取元素的内容。我如何得到? – gfppaste

+0

@gfppaste:在我的例子中,'bookID'是一个'XElement',它包含' Title'。 – Guvante

+0

哦,好吧,我现在明白了。哈哈谢谢,我需要这种精神上的推动! – gfppaste

0
string strHtml = "<input Type=\"Text\" Name=\"Initial Name Value\" Id=\"ID Value\" />"; 
XElement root = XElement.Parse(strHtml); // Carrega o Bicho... 

root.SetAttributeValue("ValueA", 1); // New Attribute - Int Value 

root.SetAttributeValue("ValueC", 3); // New Attribute - Int Value 
root.SetAttributeValue("ValueC", null); // Remove Attribute 

root.SetAttributeValue("ValueA", "New value for ValueA"); 

root.SetAttributeValue("Name", "New Name"); // Alterando Value propriedade recebida no Parse() 

Console.WriteLine(root);