C# 值太小或错误太大

C# 值太小或错误太大,c#,xml,xpath,C#,Xml,Xpath,str1和str2是字符串变量,用于保存要访问的节点的值,在本例中,str1=abc和str2=efg。变量x是一个整数,当我运行我的程序时,我得到的值对于int32错误来说太大或太小: XPathDocument xmlDoc = new XPathDocument(path); XPathNavigator course= xmlDoc.CreateNavigator(); XPathNodeIterator value = course.Select("/

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>

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

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

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

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);
编辑:这是一个简单的例子:/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之前

我使用的完整示例代码:

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
编辑:这是一个简单的例子:/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之前

我使用的完整示例代码:

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


如果打印该值,而不是将其输入Convert.ToInt32,会怎么样?您的XPath和xml在此帖子中不匹配。我已编辑了您的标题。请看,如果一致意见是否定的,它们就不应该这样做variable@Thymine已经解释了XPathNodeIterator的值表示为xpath表达式中所有节点的串联的问题。如果有多个节点,则该值可能太大,无法转换为Int32。要获取单个子节点的值,请使用MoveNext方法并将该值转换为Int32…如果打印该值,而不是将其输入convert.ToInt32,会怎么样?您的XPath和xml在此帖子中不匹配。我已编辑了您的标题。请看,如果一致意见是否定的,它们就不应该这样做variable@Thymine已经解释了XPathNodeIterator的值表示为xpath表达式中所有节点的串联的问题。如果有多个节点,则该值可能太大,无法转换为Int32。要获取单个子节点的值,请使用MoveNext方法并将该值转换为Int32….您确定此代码中存在异常吗?我们可以看看在哪里加载xml并创建导航器吗?我创建了自己的示例代码,可以很好地处理您的xml示例。我已经更新了代码,以包含load file语句和create navigator语句。您确定此代码中存在异常吗?我们可以看看在哪里加载xml并创建导航器吗?我创建了自己的示例代码,可以很好地处理您的xml示例。我已经更新了代码,将load file语句和create navigator语句包含在其中。使用该语句,我在根级别获得了一个数据“无效”错误?var doc=XDocument.Parsefile.xml。我需要分析实际内容吗?@JeliBeanMachine:当我运行代码时,没有出现错误,并且打印了预期的结果。@JeliBeanMachine如果你只是复制并粘贴我的答案会怎么样?Parse解析字符串。您需要用于文件。使用此选项,我在根级别获取的数据无效错误?var doc=XDocument.Parsefile.xml。我需要分析实际内容吗?@JeliBeanMachine:当我运行代码时,没有出现错误,并且打印了预期的结果。@JeliBeanMachine如果你只是复制并粘贴我的答案会怎么样?Parse解析字符串。您需要为一个文件使用。