2011-07-12 148 views
1

我想读一个XML文件,该文件如下格式:阅读在C#中复杂的XML

<rootnode> 
<a>first<b>1st</b></a> 
<a>second<b>2nd</b></a> 
</rootnode> 

我试图用的XDocument这样的:

XDocument loadedData = XDocument.Load("file.xml"); 
     var data = from query in loadedData.Descendants("a") 
        select new myClass 
        { 
         Word = (string)query.Value, 
         secondWord = (string) query.Element("b") 
        }; 

但它没有工作,作为(字符串)query.Value会给我带来整个行;“第一第一

有没有什么方法可以获取文本,而不是整个元素?

+2

如果你有任何对XML的控制,我会认真的建议重构它到更可维护的东西,例如。 '第一个第1个'。如果你能做到这一点,你的代码就会变得更干净,并且在稍后需要添加''元素时不太可能中断。 – ZombieSheep

回答

1

我不是一个真正有能力做的“正确”的方式在XML处理这么多的探索,但怎么样,如果你做了,结果一些字符串操作?

var data = from query in loadedData.Descendants("a") 
    select new myClass 
    { 
     Word = (string)query.Value.Substring(0, ((string)query.Value).Length - ((string)query.Element("b").Value).Length), 
     secondWord = (string)query.Element("b") 
    }; 

丑,但它的作品。我确定有一种“更好”的方式,但正如我所说,目前我没有足够的带宽来查看它。

编辑

正如我在原来的问题的评论中提到,如果你以书面形式摆在首位的XML的控制,倒不如重新格式化了 - 可能是这样的。

<rootnode> 
    <item><a>first</a><b>1st</b></item> 
    <item><a>second</a><b>2nd</b></item> 
</rootnode> 

这不仅使您能够整理代码弄干净值,但允许灵活地添加每个元素内多个数据项如果需要的话。例如

<rootnode> 
    <item><a>first</a><b>1st</b><c>primary</c></item> 
    <item><a>second</a><b>2nd</b><c>secondary</c></item> 
</rootnode> 
0

你需要改变你的后代从“rootnode”而不是“a”。试试这个:

XDocument loadedData = XDocument.Load("file.xml"); 
var data = (from query in loadedData.Descendants("rootnode") 
    select new myClass 
    { 
     Word = (string)query.Element("a"), 
     secondWord = ((string)query.Element("b")) 
    });