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

您的查询中有一个重大错误:

您正在使用Elementson root,但您正在寻找sdo不是根标签的直接子标签的标签。你必须Descendants改用。

此外,我认为你想要一个OR而不是一个AND关于TextBox1.

修理它:

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;

您可以看到我假设在整个 XML 文档中只datafield/data/value存在一个匹配条目。我从您更新文本框的方式中获得该信息。如果有多个标签,这将毫无意义 - 这些值会在文本框中相互覆盖。

于 2013-06-03T09:07:18.810 回答