【问题标题】:How to get specific value from a xml string in c#如何从 C# 中的 xml 字符串中获取特定值
【发布时间】:2016-08-23 02:57:40
【问题描述】:

我有以下字符串

<SessionInfo>
  <SessionID>MSCB2B-UKT3517_f2823910df-5eff81-528aff-11e6f-0d2ed2408332</SessionID>
  <Profile>A</Profile>
  <Language>ENG</Language>
  <Version>1</Version>
</SessionInfo>

现在我想获取 SessionIDvalue。我试过下面的..

var rootElement = XElement.Parse(output);//output means above string and this step has values

但在这里,

var one = rootElement.Elements("SessionInfo");

它不起作用。我该怎么办。

如果像下面这样的xml字符串怎么办。我们可以用它来获取sessionID

<DtsAgencyLoginResponse xmlns="DTS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="DTS file:///R:/xsd/DtsAgencyLoginMessage_01.xsd">
  <SessionInfo>
    <SessionID>MSCB2B-UKT351ff7_f282391ff0-5e81-524548a-11eff6-0d321121e16a</SessionID>
    <Profile>A</Profile>
    <Language>ENG</Language>
    <Version>1</Version>
  </SessionInfo>
  <AdvisoryInfo />
</DtsAgencyLoginResponse>

【问题讨论】:

    标签: c# xml string xelement


    【解决方案1】:

    rootElement 已经引用了&lt;SessionInfo&gt; 元素。试试这个方法:

    var rootElement = XElement.Parse(output);
    var sessionId = rootElement.Element("SessionID").Value;
    

    【讨论】:

    • @bill 我同意 HimBromBeere 的观点。无论如何,关键字是default namespace。第二个 XML 具有默认命名空间 xmlns="DTS"。尝试搜索如何使用 LINQ-to-XML 在命名空间中选择元素...
    【解决方案2】:

    可以通过xpath选择节点,然后获取值:

    XmlDocument doc = new XmlDocument();
    doc.LoadXml(@"<SessionInfo>
                     <SessionID>MSCB2B-UKT3517_f2823910df-5eff81-528aff-11e6f-0d2ed2408332</SessionID>
                     <Profile>A</Profile>
                     <Language>ENG</Language>
                      <Version>1</Version>
                  </SessionInfo>");
    
    string xpath = "SessionInfo/SessionID";    
    XmlNode node = doc.SelectSingleNode(xpath);
    
    var value = node.InnerText;
    

    【讨论】:

    • 这里完全不需要调用String.Format
    【解决方案3】:

    试试这个方法:

       private string parseResponseByXML(string xml)
        {
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.LoadXml(xml);
            XmlNodeList xnList = xmlDoc.SelectNodes("/SessionInfo");
            string node ="";
            if (xnList != null && xnList.Count > 0)
            {
                foreach (XmlNode xn in xnList)
                {
                    node= xn["SessionID"].InnerText;
    
                }
            }
            return node;
        }
    

    你的节点:

    xmlDoc.SelectNodes("/SessionInfo");

    不同的样本

     xmlDoc.SelectNodes("/SessionInfo/node/node");
    

    希望对你有帮助。

    【讨论】:

      【解决方案4】:

      请不要手动执行此操作。这太可怕了。使用 .NET 内置的东西,使其更简单、更可靠

      XML Serialisation

      这是正确的做法。您创建类并让它们从 XML 字符串自动序列化。

      【讨论】:

      • XElement 是“.NET-Stuff”,并带有 LinqToXml。这样做完全没问题。
      • 我猜 OP 只对单个值感兴趣,因此他不需要创建类和添加序列化器属性的开销。 har07 的方法很聪明,非常适合这个目的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-20
      • 2020-02-25
      • 2013-11-20
      • 1970-01-01
      • 2016-07-17
      相关资源
      最近更新 更多