【问题标题】:C# GET XML TAG VALUEC# 获取 XML 标记值
【发布时间】:2012-11-28 12:46:07
【问题描述】:

我有一个名为 BackupManager.xml 的 xml 文件

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<Settings>
<directory id="backUpPath" value="D:/BACKUPS/"></directory>
<filename id="feilname" value="SameName"></filename>
<period id ="period" value="15"></period>
</Settings>
</configuration>

我正在尝试从标签中获取值到字符串 例如:- 我需要将 'backUpPath' 标记的值作为 'D:/BACKUPS/' 到一个字符串说 'str'

我试过的代码是

XmlDocument infodoc = new XmlDocument();
infodoc.Load("BackupManager.xml");
//int col = infodoc.GetElementsByTagName("directory").Count;
String str = infodoc.GetElementByID("directory").value;

但我在“str”上得到空值

【问题讨论】:

  • 如果答案对你有帮助,别忘了点赞

标签: c# xml


【解决方案1】:

试试

linq转xml方式

IEnumerable<XElement> direclty = infodoc.Elements("Settings").Elements("directory");
var rosterUserIds = direclty .Select(r => r.Attribute("value").Value);

   XmlNodeList nodeList=
(infodoc.SelectNodes("configuration/Settings/directory"));

foreach (XmlNode elem in nodeList)
{
string strValue = elem.Attributes[1].Value;

}

【讨论】:

  • 我们还要注意 XmlDocument 应该成为 LINQ 部分的 XDocument。因此:XDocument infodoc = XDocument.Load("BackupManager.xml");
【解决方案2】:

如果您想在这种情况下获取“目录”标签的值,请使用此语法:

var directory = infodoc.GetElementsByTagName("directory")[0].Attributes["value"].Value;

【讨论】:

    【解决方案3】:

    因为您没有 ID 为“目录”的元素。随便你

    GetElementByID("backUpPath").GetAttribute("value");
    

    或者

    GetElementsByTagName("directory");
    

    记住,第二种方法返回一个 XMLNodeList!

    【讨论】:

      【解决方案4】:

      如果你愿意,你可以使用XmlReader

         string str ="";
         using (var reader = new StreamReader(BackupManager.xml))
                  {
                      var all = reader.ReadToEnd();
                      StringReader stringReader = new StringReader(all);
                      XmlReader xmlReader = XmlTextReader.Create(stringReader,new System.Xml.XmlReaderSettings() { IgnoreWhitespace = true, IgnoreComments = true });
                      while (xmlReader.Read())
                          if (xmlReader.NodeType == XmlNodeType.Element && xmlReader.Name == "directory")
                               str = xmlReader["value"];
      
                  }
      

      【讨论】:

        【解决方案5】:
        XmlDocument infodoc = new XmlDocument();
        infodoc.Load("BackupManager.xml");
        XmlElement directoryElement = document.GetElementById("directory");
        string backupPath = directoryElement.GetAttribute("value");
        

        【讨论】:

          【解决方案6】:
          if (xml.NodeType == XmlNodeType.Element && xml.Name == "Architecture")
          {
              string architecture = xml.ReadElementContentAsString();
          }
          

          【讨论】:

            【解决方案7】:

            过去我不得不处理一个巨大的 XML 并且性能是一个问题。我所需要的只是对 XML 的非缓存、只进、只读访问。

            此外,我无法控制架构,只需要从 XML 和还有 CDATA 中提取某些标记值。

            以下是我最终使用的:

            private string GetValueFromXmlTag(string xml, string tag)
            {
                if (xml == null || tag == null || xml.Length == 0 || tag.Length == 0)
                    return "";
            
                string
                    startTag = "<" + tag + ">",
                    endTag = "</" + tag + ">",
                    value = null;
            
                int
                    startTagIndex = xml.IndexOf(tag, StringComparison.OrdinalIgnoreCase),
                    endTagIndex = xml.IndexOf(endTag, StringComparison.OrdinalIgnoreCase);
            
            
                if (startTagIndex < 0 || endTagIndex < 0)
                    return "";
            
                int valueIndex = startTagIndex += startTag.Length - 1;
            
                try
                {
                    value = xml.Substring(valueIndex, endTagIndex - valueIndex);
                }
                catch (ArgumentOutOfRangeException responseXmlParserEx)
                {
                    string err = string.Format("Error reading value for \"{0}\" tag from XXX XML", tag);
                    log.Error(err, responseXmlParserEx);
                }
            
                return (value ?? "");
            }
            

            【讨论】:

              【解决方案8】:
              XmlDocument infodoc = new XmlDocument();
                //Server.MapPath() return the xml file address
                          infodoc.Load(Server.MapPath("~/XMLFile1.xml"));
                          XmlNodeList nodeList =
              (infodoc.SelectNodes("configuration/Settings/backUPpath"));
                          foreach (XmlNode elem in nodeList)
                          {
              
                             Response.Write(elem.Attributes[1].Value);
              
                          }
              

              【讨论】:

                猜你喜欢
                • 2013-03-15
                • 1970-01-01
                • 2018-06-04
                • 1970-01-01
                • 2018-03-20
                • 1970-01-01
                • 2017-01-28
                • 2021-11-07
                • 2012-07-06
                相关资源
                最近更新 更多