查找特定的xml元素包含

本文关键字:元素 包含 xml 查找 | 更新日期: 2023-09-27 18:16:27

我有一个大的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>

查找特定的xml元素包含

您的查询中有一个主要错误:

您在root上使用Elements,但您正在寻找标签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条目。我从你更新文本框的方式中获得这些信息。如果有多个标签,这就没有意义了——这些值会在文本框中相互覆盖。