0

大きなxmlファイルがあり、親子要素の値を指定して子要素の値を取得したいのですが、xmlファイルが初めてです。ここで私のxmlを助けてください:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<masterController>   <uuid>XXXXXXXXXXXXXXXXXXXXXXXXX</uuid>  
<channels>
    <channel>
      <nodeGroups>
        <nodeGroup>
          <analogNode>
            <typeCode>8</typeCode>
            <id>1</id>
            <sdos>
              <sdo>
                <description>Host ID</description>
                <compareLevel>Ignore</compareLevel>
                <datafield xmlns:xsi="http://www.XXXXX.XXXX/XXXXX/XMLSchema-instance"
xsi:type="intField">
                  <description>Host ID</description>
                  <compareLevel>Ignore</compareLevel>
                  <offset>2</offset>
                  <size>1</size>
                  <readonly>true</readonly>
                  <isMappedToPdo>false</isMappedToPdo>
                  <ownerNodeSerial>12102904</ownerNodeSerial>
                  <ownerSdoIndex>3</ownerSdoIndex>
                  <data xsi:type="intData">
                    <value xmlns:xs="http://www.XX.CC/2XXX/XMLSchema" xsi:type="xs:int">2</value>
                    <unit></unit>
                    <min>1</min>
                    <max>15</max>
                  </data>
                  <intValue>2</intValue>
                </datafield>
                <index>3</index>
                <totalbytes>3</totalbytes>
              </sdo>
              <sdo>
                <description>Host ID</description>
                <compareLevel>Ignore</compareLevel>
                <datafield xmlns:xsi="http://www.XXXXX.XXXX/XXXXX/XMLSchema-instance"
xsi:type="intField">
                  <description>Host ID</description>
                  <compareLevel>Ignore</compareLevel>
                  <offset>2</offset>
                  <size>1</size>
                  <readonly>true</readonly>
                  <isMappedToPdo>false</isMappedToPdo>
                  <ownerNodeSerial>12102905</ownerNodeSerial>
                  <ownerSdoIndex>4</ownerSdoIndex>
                  <data xsi:type="intData">
                    <value xmlns:xs="http://www.XX.CC/2XXX/XMLSchema" xsi:type="xs:int">16</value>
                    <unit></unit>
                    <min>1</min>
                    <max>15</max>
                  </data>
                  <intValue>2</intValue>
                </datafield>
                <index>3</index>
                <totalbytes>3</totalbytes>
              </sdo>
            </sdos>
          </analogNode>
        </nodeGroup>
      </nodeGroups>
    </channel>   </channels> </masterController>

私はこれを試していますが、何も得られません:

XElement root = XElement.Load(Server.MapPath("sample.xml"));

              IEnumerable<XElement> masterco = from el in root.Elements("sdo") where (from add in   el.Elements("datafield")

                     where
                         (string)add.Element("ownerNodeSerial") == TextBox1.Text &&

                         (string)add.Element("ownerSdoIndex") == TextBox1.Text

                     select add)

                    .Any()
                  select el;
              foreach (XElement el in masterco)
              {

                TextBox3.Text = (string)el.Element("value");
              }

私はこれを取得したい:

 <value xmlns:xs="http://www.XX.CC/2XXX/XMLSchema" xsi:type="xs:int">16</value>

そしてそれを更新することができます。

4

1 に答える 1

1

クエリに重大なエラーが 1 つあります。

Elementsonを使用していますが、ルート タグの直接の子ではないrootタグを探しています。代わりsdoに使用する必要があります。Descendants

さらに、のテキストに関して のOR代わりにが必要だと思います。ANDTextBox1

修理する:

var masterco = from el in root.Descendants("sdo")
               where (from add in   el.Elements("datafield")
                      where
                          (string)add.Element("ownerNodeSerial") == TextBox1.Text ||
                          (string)add.Element("ownerSdoIndex") == TextBox1.Text
                       select add).Any()
               select el;

必要な値を実際に取得するには、別のクエリを使用する必要があります。sdoタグを選択する必要はまったくありません。

var value = root.Descendants("datafield")
                .Where(x => (string)x.Element("ownerNodeSerial") == TextBox1.Text ||
                            (string)x.Element("ownerSdoIndex") == TextBox1.Text)
                .Select(x => (string)x.Element("data").Element("value"))
                .Single();

TextBox3.Text = value;

datafield/data/valueXML ドキュメント全体で、一致するエントリが1 つだけ存在すると想定していることがわかります。テキストボックスを更新する方法からその情報を取得します。複数のタグがある場合、これは意味がありません。テキスト ボックス内の値が互いに上書きされます。

于 2013-06-03T09:07:18.810 に答える