2

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>
4

2 に答える 2

3

編集:これの単純なケース:"/root/x[@atr ='" + str1 + "']/y[@atr ='" + str2 + "']/value1"パス内の属性の文字列を引用符で囲む必要があります。

あなたは/root/x[@atr=abc]/y[@atr=efg]/value1これが構築するxpathを構築するでしょう/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
于 2012-11-29T20:58:50.890 に答える
1

次の例のように、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);
于 2012-11-29T20:48:22.743 に答える