【问题标题】:How to get the xml node value into a string如何将xml节点值转换为字符串
【发布时间】:2016-10-18 06:32:16
【问题描述】:

如何获取字符串中的xml节点值。

我收到此错误

根级别的数据无效。第 1 行,位置 1。

此行显示错误

xmldoc.LoadXml(xmlFile);

我的 xml

<?xml version="1.0" encoding="utf-8" ?>

<UOM>

  <!-- The selected currency used will be stored here for Code reference" -->
  <ActiveCurrencyType>
    <ActiveCurrency>U.S.Dollar</ActiveCurrency>
    <ActiveCode>USD</ActiveCode>
    <ActiveSymbol>$</ActiveSymbol>
  </ActiveCurrencyType>

  <!-- The selected Dimension used will be stored here for Code reference -->
  <ActiveDimension>
    <ActiveDimensionUOM>Inches</ActiveDimensionUOM>
    <ActiveDimensionSymbol>.in</ActiveDimensionSymbol>
  </ActiveDimension>

  <!-- The selected weight used will be stored here for Code reference -->
  <ActiveWeight>
    <ActiveWeightUOM>Pounds</ActiveWeightUOM>
    <ActiveWeightSymbol>lb</ActiveWeightSymbol>
  </ActiveWeight>

</UOM>

C#代码

    string xmlFile = Server.MapPath("~/HCConfig/HCUOM.xml");
    XmlDocument xmldoc = new XmlDocument();
    xmldoc.LoadXml(xmlFile);
    XmlNodeList nodeList = xmldoc.GetElementsByTagName("ActiveDimensionSymbol");
    string ActiveDimensionSymbol = string.Empty;
    foreach (XmlNode node in nodeList)
    {
        ActiveDimensionSymbol = node.InnerText;
    }

我怎样才能做到这一点?

【问题讨论】:

  • 我刚刚测试了您的代码,它可以很好地加载文件。检查,您的路径是否正确。 (Server.MapPath())
  • 认为您的 XML 文件路径不正确。你的代码很好。或者,您可以尝试 XDocument。 XDocument 文档 = System.Xml.Linq.XDocument.Load(xmlFile); var symbols = doc.Root.Descendants("ActiveDimension").Select(x => x.Elements("ActiveDimensionSymbol").ToList()).ToList();
  • @kashi_rock 否,如果是这种情况,则会引发不同的异常。请注意使用 XmlDocument 类的操作,而不是 XDocument
  • 我能够在使用 XmlDocument 时重现此错误,但能够使用 XDocument 读取 XML。甚至我的有效 XML 文件也出现了同样的错误。

标签: c# xml


【解决方案1】:

你使用了错误的重载,LoadXml 没有按照你的想法做。

使用xmldoc.Load(xmFile);,因为该方法将文件路径作为输入。 LoadXml 需要一个带有 xml 的字符串。

异常表明该错误。处理的不是 XML,文件路径也不是。

如果我在本地运行,则更改后的字符串 ActiveDimensionSymbol 包含 .in

如果您想使用LoadXml,您应该首先以字符串形式读取整个文件,例如:

 xmldoc.LoadXml(File.ReadAllText(xmlFile));

但如果有接受文件的方法,调用File.ReadAllText 确实只是开销。

【讨论】:

  • 我认为问题不存在,我在本地尝试了所有方法但结果相同,改用 XDocuments 效果很好
  • @Mostafiz 我也做了同样的事情,替换那个单一的方法调用使代码工作,它甚至返回预期的结果
【解决方案2】:

您可以使用Descendants() 方法以特定名称获取所有XElement,该名称位于System.Xml.Linq 命名空间中。

XDocument doc = XDocument.Load("XMLFile1.xml");
string[] allActiveWeightUOMs = doc.Descendants("ActiveWeightUOM").Select(o => o.Value).ToArray();

// allActiveWeightUOMs : "Pounds" ...

【讨论】:

    【解决方案3】:

    从这里link 可以看出,您用来加载 XML 的方法除了 xml 通过字符串而不是 xml 文件。你可以用XmlDocument.Load代替XmlDocument.LoadXml

    【讨论】:

      【解决方案4】:

      试试这个代码,它与这个 xml 配合得很好

      string xmlFile = Server.MapPath("~/HCConfig/HCUOM.xml");
      XDocument doc = XDocument.Load(xmlFile );
      
      var nodeList = doc.Descendants("ActiveDimensionSymbol");
      string ActiveDimensionSymbol = string.Empty;
      foreach (var node in nodeList)
      {
         ActiveDimensionSymbol = node.Value;
      }
      

      【讨论】:

        猜你喜欢
        • 2011-08-28
        • 2011-10-05
        • 1970-01-01
        • 1970-01-01
        • 2015-02-06
        • 1970-01-01
        • 2018-03-09
        • 2014-07-08
        • 1970-01-01
        相关资源
        最近更新 更多