【问题标题】:get node value from string xml从字符串 xml 中获取节点值
【发布时间】:2013-05-08 23:28:18
【问题描述】:

我有这个字符串 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>";

这是字符串XML

<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>

我想要的是获取详细标签的值,我正在尝试使用这个示例,但都返回 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");
        }

【问题讨论】:

  • 我不明白你到底想要什么。你能给我们举个例子吗...What I want is to get the value of the detail Tag 是什么意思。你期待一个节点吗?节点列表?一个字符串?一个字符串数组?里面应该有什么?

标签: c# xmldocument


【解决方案1】:

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

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;
}

【讨论】:

  • 感谢 Swen 它是如何完成的,但据我所知,在所有情况下我都会收到 ErrorId 标记,因此我决定使用以下代码:'XmlDocument doc = new XmlDocument(); doc.LoadXml(innerXml); string errorIdTags = doc.GetElementsByTagName("ErrorId")[0].InnerText;'
  • 我还是建议你检查标签是否存在,尽可能多地覆盖错误。
  • ErrorIdTags.Count == 1 存在ErrorIdTags[0] 时,ErrorIdTags.Count &lt;= 1 不提供true。应该是ErrorIdTags.Count &lt;1!
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    第一次尝试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")

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多