【问题标题】:value too small or too big error值太小或太大错误
【发布时间】:2012-11-29 20:01:38
【问题描述】:

str1 和 str2 是字符串变量,它们保存要访问的节点的值,在这种情况下 str1 = "abc" 和 str2 = "efg"。变量 x 是一个整数,当我运行我的程序时,我得到一个“值对于 int32 来说太大或太小”错误:

XPathDocument xmlDoc = new XPathDocument(path);
XPathNavigator course= xmlDoc.CreateNavigator();                 
XPathNodeIterator value = course.Select("/root/x[@atr =" + str1 + "]/y[@atr =" + str2 + "]/value1");
x = Convert.ToInt32(value.Current.Value);

我的 xml 是:

            <root>
                <x atr = "abc">
                    <y atr ="efg">  
                        <value1>12</value1>
                        <value2>25</value2>
                        <value3>16</value3>
                    </y>
                </x>
            </root>

【问题讨论】:

  • 如果您打印该值,而不是将其提供给 Convert.ToInt32,该怎么办? (你的 XPath 和 xml 在这篇文章中不匹配)
  • 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
  • 我需要将 Xpath 中的值加载到变量中
  • @Thymine 已经解释了问题,即您的 XPathNodeIterator 的值表示为 xpath 表达式中所有节点的串联。如果您有许多节点,则该值可能太大而无法转换为 Int32。要获取单个子节点的值,请使用 MoveNext() 方法并将值转换为 Int32....

标签: c# xml xpath


【解决方案1】:

编辑:这是一个简单的例子:"/root/x[@atr ='" + str1 + "']/y[@atr ='" + str2 + "']/value1" 你需要在路径中的属性字符串周围加上引号。

您将构建 xpath /root/x[@atr=abc]/y[@atr=efg]/value1 这将构建 /root/x[@atr='abc']/y[@atr='efg']/value1 与大多数语言一样,字符串也需要在 xpath 中使用引号。


您的原始代码的问题在于,使用XPathNodeIterator,您需要先调用value.MoveNext();,然后再调用value.Current

XPathNodeIterator value = course.Select("/root/x/y/value1");
value.MoveNext();
x = Convert.ToInt32(value.Current.Value);

我正在使用的完整示例代码:

var doc = XDocument.Parse(@"<root>
    <x>
        <y> 
            <value1>12</value1>
            <value2>25</value2>
            <value3>16</value3>
        </y>
    </x>
</root>");

////Also works for XmlDocument
//XmlDocument doc = new XmlDocument();
//doc.LoadXml(@"<root>
//  <x>
//      <y> 
//          <value1>12</value1>
//          <value2>25</value2>
//          <value3>16</value3>
//      </y>
//  </x>
//</root>");

XPathNavigator course = doc.CreateNavigator();

XPathNodeIterator value = course.Select("/root/x/y/value1");
Console.WriteLine(value.Current.Value);  //Outputs 122516, which is the same as doc.Root.Value or XmlDocument.InnerText
value.MoveNext();
Console.WriteLine(value.Current.Value);  //Outputs 12, correctly
int x = Convert.ToInt32(value.Current.Value);  //Parses fine

【讨论】:

  • 您确定异常来自此代码吗?我们能看到您在哪里加载 xml 并创建导航器吗?我创建了自己的示例代码,与您的 xml 示例配合得很好。
  • 我已经更新了我的代码以包含加载文件语句和创建导航器语句的位置。
【解决方案2】:

我将只使用 XDocument 的扩展方法 XPathSelectElement,如下例所示:

var doc = XDocument.Parse(@"<root>
    <x atr = 'abc'>
        <y atr = 'efg'> 
            <value1>12</value1>
            <value2>25</value2>
            <value3>16</value3>
        </y>
    </x>
</root>");

var x = int.Parse(doc.XPathSelectElement("/root/x[@atr =\"abc\"]/y[@atr = \"efg\"]/value1").Value);
Console.WriteLine(x);

【讨论】:

  • 使用这个,我得到一个“根级别的数据无效”错误?
  • var doc = XDocument.Parse(file.xml)。我需要解析实际内容吗?
  • @JeliBeanMachine:当我运行代码时,我没有收到任何错误,并且打印了预期的结果。
  • @JeliBeanMachine 如果您只是复制并粘贴我的答案会怎样? XDocument.Parse 解析一个字符串。您需要对文件使用XDocument.Load
猜你喜欢
  • 2017-06-08
  • 2016-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-21
  • 2013-12-18
  • 1970-01-01
相关资源
最近更新 更多