2015-03-13 3 views
0

У меня есть конфигурации XML для запроса CAML:Ошибка при помощи XElement.Parse

<add key="QueryList" value="&lt;Query&gt;&lt;Where&gt;&lt;Eq&gt;&lt;FieldRef Name='Cargar_x0020_Optimyth'/&gt;&lt;Value Type='Boolean'&gt;1&lt;/Value&gt;&lt;/Eq&gt;&lt;/Where&gt;&lt;/Query&gt;" /> 
<add key="PaginacionList" value="10" /> 
<add key="QueryOptions" value="&lt;IncludeMandatoryColumns&gt;FALSE&lt;/IncludeMandatoryColumns&gt;&lt;Paging ListItemCollectionPositionNext=''/&gt;" /> 

Теперь я хочу сделать это:

XElement ndQuery = XElement.Parse(Configuracion.QueryList); 
    XElement ndViewFields = XElement.Parse(Configuracion.ViewFields); 
    XElement ndQueryOptions = XElement.Parse(Configuracion.QueryOptions); 

, но я получаю сообщение об ошибке.

Я стараюсь это с помощью XmlElement и его работы:

XmlElement ndQuery = xmlDoc.CreateElement("Query"); 
    if (!String.IsNullOrEmpty(Configuracion.QueryList)) 
    { 
     ndQuery.InnerXml = Configuracion.QueryList; 
    } 
    XmlElement ndViewFields = xmlDoc.CreateElement("ViewFields"); 
    if (!String.IsNullOrEmpty(Configuracion.ViewFields)) 
    { 
     ndViewFields.InnerXml = Configuracion.ViewFields; 
    } 
    XmlElement ndQueryOptions = xmlDoc.CreateElement("QueryOptions"); 
    if (!String.IsNullOrEmpty(Configuracion.QueryOptions)) 
    { 
     ndQueryOptions.InnerXml = Configuracion.QueryOptions; 
    } 

    XElement ndQuery = XElement.Parse(ndQuery2.OuterXml); 
    XElement ndViewFields = XElement.Parse(ndViewFields2.OuterXml); 
    XElement ndQueryOptions = XElement.Parse(ndQueryOptions2.OuterXml); 

Я хочу избежать использования XmlElement, и только XElement.

Любое решение об этом?

+1

Какая ошибка? Какая строка создает ошибку? – JLRishe

+0

@xanatos значение, если для ** key = "QueryList" ** в app.config. – Kiquenet

ответ

-1

Весьма сложный, потому что у вас есть фрагмент Xml (несколько корневых узлов) в Configuracion.QueryOptions. XLinq не имеет прямых методов для его обработки ... На основе Fragmented XML string parsing with Linq, вы могли бы

public static IEnumerable<XNode> ParseXml(string xml) 
{ 
    // Note the added escaping 
    // You can replace it with WebUtility.HtmlDecode 
    // They are defined in different assemblies 
    xml = HttpUtility.HtmlDecode(xml); 

    var settings = new XmlReaderSettings 
    { 
     ConformanceLevel = ConformanceLevel.Fragment, 
     IgnoreWhitespace = true 
    }; 

    using (var stringReader = new StringReader(xml)) 
    using (var xmlReader = XmlReader.Create(stringReader, settings)) 
    { 
     xmlReader.MoveToContent(); 
     while (xmlReader.ReadState != ReadState.EndOfFile) 
     { 
      yield return XNode.ReadFrom(xmlReader); 
     } 
    } 
} 

, а затем

XElement ndQuery = new XElement("Query", ParseXml(Configuracion.QueryList)); 
XElement ndViewFields = new XElement("ViewFields", ParseXml(Configuracion.ViewFields)); 
XElement ndQueryOptions = new XElement("QueryOptions", ParseXml(Configuracion.QueryOptions)); 

Использование HttpUtility.HtmlDecode/WebUtility.HtmlDecode от Built in .NET function for unescaping characters in XML stream?.

Или, возможно, вы хотите сохранить конфигурацию, закодированные как они ... то

XElement ndQuery = new XElement("Query", HttpUtility.HtmlDecode(Configuracion.QueryList)); 
XElement ndViewFields = new XElement("ViewFields", HttpUtility.HtmlDecode(Configuracion.ViewFields)); 
XElement ndQueryOptions = new XElement("QueryOptions", HttpUtility.HtmlDecode(Configuracion.QueryOptions)); 

(намного короче :-))

+0

Я уверен, что OP не нужно активно игнорировать значения конфигурации. – JLRishe

0

Ваш XML в настройках QueryOptions не является элементом. Это два родственных элемента. Вам нужен один окружающий, который в этом случае будет <QueryOptions>:

<add key="QueryOptions" 
value="&lt;QueryOptions&gt;&lt;IncludeMandatoryColumns&gt;FALSE&lt;/IncludeMandatoryColumns&gt;&lt;Paging ListItemCollectionPositionNext=''/&gt;&lt;/QueryOptions&gt;" /> 
Смежные вопросы