Pergunta

Qualquer um sabe por que isso XPath expressão "catzero/@id" não está trabalhando neste xml

document = XDocument.Load("file.xml");
var product = document.XPathSelectElements("//product", nameSpaceResolver).First();
var category = ((IEnumerable) product.XPathEvaluate("catzero/@id")).Cast<XAttribute>().first().value; //catezero/@id is null
Foi útil?

Solução

Você está entrando expressão XPath em Xelement ()?
Para usar XPath você deve tentar http: // msdn.microsoft.com/en-us/library/system.web.ui.templatecontrol.xpathselect.aspx

Outras dicas

XPath e Linq-to-XML (XEelement) não costumam corresponder - Linq para XML usos a sua própria abordagem para atravessar documentos XML

.

No seu caso, você seria capaz de fazer algo como:

XDocument doc = XDocument.Load("http://www.quillarts.com/Test/Feed2.xml");

foreach(XElement xe in doc.Descendants("product"))
{
    if(xe.Element("catzero") != null)
    {
        var attr = xe.Element("catzero").Attribute("id");

        if(attr != null && attr.Value == "20")
        {
            string elementValue = xe.Value;
        }
    }
}

Eu não sei da sua pergunta o que você quer fazer com esses elementos e / ou atributos -. Ir em frente e fazer o que você precisa fazer

Escrevendo-o como:

var product = document.XPathSelectElements("//product", nameSpaceResolver).First();
IEnumerable at = (IEnumerable)product.XPathEvaluate("catzero/@id");
var category = at.Cast<XAttribute>().First<XAttribute>().Value;

finas para mim funciona se você esperar que o valor da categoria a ser 20.

Ele funciona muito bem para mim (fixação do F em First(), o V em Value, e passar um null namespace-resolver), dando à categoria "20". Você espera algo diferente? Se sim, quais e porquê?

Da mesma forma:

string category = document.Descendants("product").First()
             .Elements("catzero").Attributes("id").First().Value;

dá "20".

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top