Предложение LINQ to XML LIKE - PullRequest
1 голос
/ 19 апреля 2011

С учетом следующего XML

<?xml version="1.0"?>
<Message>
      <ArrayOfStock xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <Stock>
                  <StockID>9cddb639-25ee-4415-be07-3109e5ae9883</StockID>
                  <Description>Stock Item 0</Description>
            </Stock>
            <Stock>
                  <StockID>f89f02f9-b359-48c8-8d2f-3a950837f4fb</StockID>
                  <Description>Stock Item 1</Description>
            </Stock>
            <Stock>
                  <StockID>3338ec80-f59e-4979-a04c-f7d52e386bb7</StockID>
                  <Description>Stock Item 2</Description>
            </Stock>
      </ArrayOfStock>
</Message>

Есть ли лучший / более правильный способ вернуть дочерние элементы сообщения, ГДЕ имена детей начинаются с "ArrayOf", а затем этого?

IEnumerable<XElement> array = from arrayOfX 
                              in document.Root.Elements() 
                              where arrayOfX.Name.ToString().IndexOf("ArrayOf") > -1
                              select arrayOfX;

PS: это также имеет проблему для крайнего случая, когда IndexOf () вернет 0 для значения String.Empty.(Хотя не уверен, что это действительно возможно в хорошо отформатированном XML - не думаю, что это так?)

Ответы [ 2 ]

3 голосов
/ 19 апреля 2011

Используйте метод String.StartsWith() ?

0 голосов
/ 19 апреля 2011

Лучший способ вернуть объекты, которые моделируют структуру xml?Да.Создайте класс, который моделирует структуру xml, и сериализуйте xml следующим образом:

[XmlRootAttribute("ArrayOfStocks")]
public class Stocks 
{     
    [XmlArrayItem(typeof(Stock))]     
    public Stock[] Stocks { get; set; }  
}
public class Stock
{
    public StockID { get; set; }

    public Description { get; set; }
}
    public class Message
    {
        public Stocks { get; set; }

        public static Message Load( string xml )
        {
                var deserializer = new XmlSerializer( typeof( Stocks ) );
                Stocks stocks = null;
                using( TextReader textReader = new StringReader( data ) )
                {
                    stocks = (Stocks)deserializer.Deserialize( textReader );
                }

                return stocks;
        }
    }

Затем вы можете получить доступ к массиву акций следующим образом:

var message = Message.Load( "<xml>" );
foreach( var stock in message.Stocks )
{
   Console.WriteLine( stock );
}

Затем, на своем краюдело », вам не придется беспокоиться об этом.Массив Stocks будет просто пустым.

...