首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果给定的父元素下存在某个元素,则仅解析xml文件

如果给定的父元素下存在某个元素,则仅解析xml文件
EN

Stack Overflow用户
提问于 2014-01-11 03:53:23
回答 2查看 96关注 0票数 2
代码语言:javascript
复制
//Get and translate interface configs
var interfaces = CurrentXML
                 .Descendants("interface-list")
                 .Elements("interface")
                 .Select(i => new { NAMEIF = i.Element("name").Value ,
                                    DESC   = i.Element("description").Value ,
                                    NOSHUT = i.Element("if-item-list")
                                              .Element("item")
                                              .Element("physical-if")
                                              .Element("enabled")
                                              .Value
                                  }
                   ) ;

//Build ASA Configuration and display to user.
ASAconfig.Append( "<br />" + deviceconf.HOSTNAME.ToString() ) ;

foreach ( var el in interfaces )
{
  ASAconfig.Append(
    string.Format("<br />nameif {0}<br /> description {1}<br /> {2}" ,
      el.NAMEIF != null ? el.NAMEIF.ToString() : string.Empty ,
      el.DESC   != null ? el.DESC.ToString()   : string.Empty ,
      el.NOSHUT.ToString() == "1" ? "no shut"  : string.Empty
      )
    ) ;
}

很抱歉,如果这篇文章的格式不正确,这是我的第一篇文章。

我正在用ASP.NET和C#创建一个网站来解析XML文件,并翻译某些元素的值,并附加到任意字符串。我遇到的问题是,XML文件中的"interface“元素不包含"enabled”子元素(可能是"physical-if“元素,对于虚拟接口也不存在)。

如果这个子代不存在,我不想从XML文件中执行选择,正如您所看到的,我使用了一个"where“子句,但到目前为止,我已经删除了这个子句。下面粘贴了一个示例XML文件的一部分,显示了我所说的区别。任何建议都是非常感谢的。

谢谢您抽时间见我。

代码语言:javascript
复制
<interface>
  <name>SSL-VPN</name>
  <description>SSL VPN</description>
  <property>2</property>
  <if-item-list>
    <item>
      <item-type>5</item-type>
      <sslvpn>SSL-VPN</sslvpn>
    </item>
  </if-item-list>
</interface>
<interface>
  <name>DMZ</name>
  <description>DMZ</description>
  <property>0</property>
  <if-item-list>
    <item>
      <item-type>1</item-type>
      <physical-if>
        <if-num>2</if-num>
        <enabled>1</enabled>
        <if-property>3</if-property>
        <ip>10.21.2.1</ip>
        <netmask>255.255.0.0</netmask>
        <mtu>1500</mtu>
        <auto-negotiation>1</auto-negotiation>
        <link-speed>100</link-speed>
        <mac-address-enable>0</mac-address-enable>
        <mac-address />
        <full-duplex>1</full-duplex>
        <secondary-ip-list />
        <anti-spoof>2</anti-spoof>
        <anti-scan>0</anti-scan>
        <block-notification>0</block-notification>
        <dos-prevention>1</dos-prevention>
        <intra-inspection>0</intra-inspection>
        <dhcp-server>
          <server-type>0</server-type>
        </dhcp-server>
        <vpn-df-bit>0</vpn-df-bit>
        <qos>
          <max-link-bandwidth>0</max-link-bandwidth>
          <qos-marking>
            <marking-field>2</marking-field>
            <marking-method>
              <marking-type>0</marking-type>
            </marking-method>
            <priority-method>0</priority-method>
          </qos-marking>
        </qos>
        <static-mac-ip-binds>
          <restrict-traffic>0</restrict-traffic>
        </static-mac-ip-binds>
        <static-mac-acl>
          <enable>0</enable>
        </static-mac-acl>
      </physical-if>
    </item>
  </if-item-list>
...
EN

回答 2

Stack Overflow用户

发布于 2014-01-11 07:10:10

尝试在以下位置添加此内容:

代码语言:javascript
复制
.Elements("interface")
.Where(i => null != i.Descendants("enabled").FirstOrDefault())
.Select // ...
票数 0
EN

Stack Overflow用户

发布于 2014-01-11 08:16:52

Linq没有什么神奇之处(除了它是当前最流行的银弹)。在我看来,如果您使用XPath来选择您的元素集,那么您想要做什么会更容易,也可能更清楚。

使用XPath,它非常简单:

代码语言:javascript
复制
XmlDocument xmldoc = new XmlDocument() ;
xmldoc.LoadXml(rawXml) ; // load your XML string here

XmlNodeList selectedNodes = xmldoc.SelectNodes( "/interface-list/interface[if-item-list/item/physical-if/enabled]" ) ;

应该注意的是,XmlNodeListIEnumerable而不是IEnumerable<T>,所以要执行任何类型的Linq magick,您需要像这样转换它:

代码语言:javascript
复制
selectedNodes
.Cast<XmlNode>()
.Select( ... )
;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21053260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档