我有一个加载了一个XML文档,其结构如下:
<?xml version="1.0" encoding="UTF-8" ?>
<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
<sheetData>
<row r="1" spans="1:2">
<c r="A1" t="s">
<v>0</v>
</c>
<c r="B1" t="s">
<v>1</v>
</c>
</row>
</sheetData>
</worksheet>
我想在文档中查询具有属性c
的名为t = s
的任何元素。
我尝试了很多不同的变体:
XDocument xmlDoc = XDocument.Load(@"..\..\Sheet1.xml");
var rows = from row in xmlDoc.Root.Descendants("worksheet").Elements("sheetData")
select row;
但它总是返回一个空集。
我错过了什么?
答案 0 :(得分:3)
您需要指定使用Descendants或Elements获得的节点的命名空间。
XNamespace ns = "http://schemas.openxmlformats.org/spreadsheetml/2006/main";
var rows = from row in xmlDoc.Root.Descendants(ns + "sheetData")
select row;
答案 1 :(得分:1)
Root元素是<worksheet/>
元素,因此向根询问工作表后代将始终返回空集。删除.Descendants("worksheet")
子句,您应该开始看到一些结果。
答案 2 :(得分:0)
XNamespace ns = "http://schemas.openxmlformats.org/spreadsheetml/2006/main";
XDocument xmlDoc = XDocument.Load(@"..\..\Sheet1.xml");
var rows = from row in xmlDoc.Root.Element(ns + "sheetData").Elements(ns + "row")
select row;
这会从root / sheetData元素中获取所有“row”元素。
答案 3 :(得分:0)
以下是我在Linqpad中编写的一些代码,用于对c进行过滤,其中t = s。
我知道答案已经被接受了,但是这个解决方案实际上是过滤了,而上面的其他答案都没有:)
希望这有帮助!
void Main()
{
var xml = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
<worksheet xmlns=""http://schemas.openxmlformats.org/spreadsheetml/2006/main"" xmlns:r=""http://schemas.openxmlformats.org/officeDocument/2006/relationships"">
<sheetData>
<row r=""1"" spans=""1:2"">
<c r=""A1"" t=""s"">
<v>0</v>
</c>
<c r=""A2"" t=""b"">
<v>0</v>
</c>
<c r=""B1"" t=""s"">
<v>1</v>
</c>
</row>
</sheetData>
</worksheet>";
XNamespace ns = "http://schemas.openxmlformats.org/spreadsheetml/2006/main";
var d = XDocument.Parse(xml);
//d.Dump();
//d.Dump("xdocument dump");
var q = from cell in d.Root.Descendants(ns + "sheetData").Descendants(ns + "row").Descendants(ns + "c")
where cell.Attributes("t").FirstOrDefault().Value == "s"
select cell;
q.ToList().Dump();
}