使用XElement.Parse时出错

时间:2015-03-13 11:35:09

标签: c# xml xelement

我有一个查询CAML的XML配置:

<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

关于它的任何解决方案?

2 个答案:

答案 0 :(得分:0)

QueryOptions设置中的XML不是一个元素。它是两个兄弟元素。你需要一个围绕它们的人,在这种情况下是<QueryOptions>

<add key="QueryOptions" 
 value="&lt;QueryOptions&gt;&lt;IncludeMandatoryColumns&gt;FALSE&lt;/IncludeMandatoryColumns&gt;&lt;Paging ListItemCollectionPositionNext=''/&gt;&lt;/QueryOptions&gt;" />

答案 1 :(得分:-1)

相当复杂,因为Configuracion.QueryOptions中有一个Xml片段(多个根节点)。 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));

(更短:-))