从字符串xml中获取节点值

时间:2013-05-08 23:28:19

标签: c# xmldocument

我有这个字符串XML

string innerXml = @"<detail><WCFFaultExcepcion xmlns=""http://schemas.datacontract.org/2004/07/CIEL.DigiturnoMega.Entidades"" xmlns:i=""http://www.w3.org/2001/XMLSchema-instance""><ErrorId>b7e9d385-9118-4297-baca-db9ab00f3856</ErrorId><Message>Índice fuera de los límites de la matriz.</Message></WCFFaultExcepcion></detail>";

这是stringXML

<detail>
    <WCFFaultExcepcion xmlns="http://schemas.datacontract.org/2004/07/CIEL.DigiturnoMega.Entidades" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
        <ErrorId>b7e9d385-9118-4297-baca-db9ab00f3856</ErrorId>
        <Message>Índice fuera de los límites de la matriz.</Message>
    </WCFFaultExcepcion>
</detail>

我想要的是获取详细信息Tag的值,我正在尝试使用此示例,但所有返回null o cero count,你能帮助我吗?

 private static void Example()
        {
            string innerXml = @"<detail><WCFFaultExcepcion xmlns=""http://schemas.datacontract.org/2004/07/CIEL.DigiturnoMega.Entidades"" xmlns:i=""http://www.w3.org/2001/XMLSchema-instance""><ErrorId>b7e9d385-9118-4297-baca-db9ab00f3856</ErrorId><Message>Índice fuera de los límites de la matriz.</Message></WCFFaultExcepcion></detail>";

            XmlDocument doc = new XmlDocument();
            doc.LoadXml(innerXml);

            XmlNode node = (XmlNode)doc.DocumentElement;
            XmlNode optionalNode = node.SelectSingleNode("/detail/WCFFaultExcepcion");
            XmlNode optionalNode1 = node.SelectSingleNode("detail/WCFFaultExcepcion");
            XmlNode optionalNode2 = node.SelectSingleNode("/detail/WCFFaultExcepcion/ErrorId");
            XmlNode optionalNode3 = node.SelectSingleNode("detail/WCFFaultExcepcion/ErrorId");
            XmlElement optional = doc.SelectSingleNode(@"/detail/WCFFaultExcepcion/ErrorId") as XmlElement;
            XmlElement optiona2 = doc.SelectSingleNode(@"detail/WCFFaultExcepcion/ErrorId") as XmlElement;
            XmlNode xNode = doc.DocumentElement.SelectNodes("ErrorId")[0];
            XmlNodeList xnList = doc.SelectNodes("/detail/WCFFaultExcepcion");
            XmlNodeList xnList1 = doc.SelectNodes("detail/WCFFaultExcepcion");
            XmlNodeList xnList2 = doc.SelectNodes("/detail/WCFFaultExcepcion/ErrorId");
            XmlNodeList xnList3 = doc.SelectNodes("detail/WCFFaultExcepcion/ErrorId");
        }

3 个答案:

答案 0 :(得分:9)

我认为这可能是您的解决方案:

XmlDocument doc = new XmlDocument();
doc.LoadXml(innerXml);

XmlNodeList ErrorIdTags = doc.GetElementsByTagName("ErrorId");
if(ErrorIdTags.Count <= 1)
{
    // The tag could not be fond
}
else
{
    // The tag could be found!
    string ErrorId = ErrorIdTags[0].InnerText;
}

答案 1 :(得分:1)

尝试使用Linq to Xml(http://msdn.microsoft.com/en-us/library/bb387098%28v=VS.100%29.aspx) - 代码非常优雅。

答案 2 :(得分:0)

第一次尝试XmlNode node = (XmlNode)doc.DocumentElement;应该有用,应该包含子项。试试XmlNode firstChildNode = node.FirstChild; ...这会让你成为第一个孩子,并且不会为空/ null。

但是当使用xpath时,由于定义的命名空间,您将遇到问题。您必须在doc中创建一个新的命名空间,并指定 http://schemas.datacontract.org/2004/07/CIEL.DigiturnoMega.Entidades 一个简写(例如 sh )...然后在您的xpath你可以去doc.SelectSingleNode(@"/detail/sh:WCFFaultExcepcion/sh:ErrorId")