Должно ли это быть выражение XPath или вы можете использовать Linq
с системой XDocument
.
Например.
var xDocument = XDocument.Parse(@"<bookstore>
<book>
<bookID>100</bookID>
<name> The cat in the hat </name>
</book>
<book bookID=""90"">
<name> another book </name>
</book>
<book>
<bookID>103</bookID>
<name> a new book </name>
</book>
</bookstore>");
foreach (var xBook in xDocument.Descendants("book"))
{
var bookIdNode = xBook.Elements("bookID").FirstOrDefault();
int bookId = 0;
///there is a book id as an element
if (bookIdNode != null)
{
//invalid book id.. should be an int
if (!int.TryParse(bookIdNode.Value, out bookId))
continue;
}
else
{
var bookIdAttr = xBook.Attributes("bookID").FirstOrDefault();
if (bookIdAttr == null || !int.TryParse(bookIdAttr.Value, out bookId))
continue;
}
if (bookId == 0)
continue;
//else we got our book id
}
Этот код довольно просто, перебирает над потомками с именем book
элемента. Сначала он проверяет, есть ли элемент с именем bookID
(с учетом регистра). Если есть попытки проанализировать идентификатор книги как int
, используя метод int.TryParse()
.
Если нет bookID
элементов его рядом проверяет, есть ли какие-либо атрибуты с именем bookID
и захватывает первый экземпляр (или нуль), используя FirstOrDefault()
метод расширения. Если есть экземпляр атрибута bookID
, он также пытается проанализировать int, используя метод int.TryParse()
.
К концу небольшого фрагмента мы проверяем, является ли bookId
0
, если он равен нулю, мы можем предположить, что что-то пошло не так. Однако это не должно произойти, так как логика должна содержать перечисление и забыть об элементах без элемента bookID
или атрибута bookID
.
Вы должны убедиться, что структура XML фиксируется схемой, прежде чем начать дело с ним. Это избавит вас от многих неприятностей позже. – MarcinJuraszek
В чем проблема с решением, предложенным в [предыдущем вопросе] (http://stackoverflow.com/questions/31778330/c-sharp-sort-by-elements-or-attribute-with-one-method)? – har07
@ har07 Я googling даю ключевое слово и пытаюсь понять это решение. Вот почему я еще не ответил. Я довольно новичок в C#. Извиняюсь .. – user3735871