LINQ to XML Вопрос новичка - PullRequest
       37

LINQ to XML Вопрос новичка

0 голосов
/ 22 декабря 2009

У меня загружен документ 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;

Но он всегда возвращает пустой набор.

Чего мне не хватает?

Ответы [ 4 ]

3 голосов
/ 22 декабря 2009

Вам необходимо указать пространство имен узла, который вы получаете с потомками или элементами.

XNamespace ns = "http://schemas.openxmlformats.org/spreadsheetml/2006/main";
var rows = from row in xmlDoc.Root.Descendants(ns + "sheetData")
       select row;
1 голос
/ 22 декабря 2009

Элемент Root является элементом <worksheet/>, поэтому запрос корня для потомка рабочего листа всегда будет возвращать пустой набор. Удалите предложение .Descendants("worksheet"), и вы должны начать видеть некоторые результаты.

0 голосов
/ 27 мая 2012

Вот код, который я написал в 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();

}

0 голосов
/ 22 декабря 2009
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;

При этом все элементы "row" извлекаются из элемента root / sheetData.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...