我正在尝试读取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会给我带来整行;“首先第一”
有没有办法获取文本而不是整个元素?
答案 0 :(得分: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>
这不仅可以让您整理代码以获得干净的值,还可以根据需要灵活地在每个元素中添加更多数据项。 e.g。
<rootnode>
<item><a>first</a><b>1st</b><c>primary</c></item>
<item><a>second</a><b>2nd</b><c>secondary</c></item>
</rootnode>
答案 1 :(得分: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"))
});