//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文件的一部分,显示了我所说的区别。任何建议都是非常感谢的。
谢谢您抽时间见我。
<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>
...发布于 2014-01-11 07:10:10
尝试在以下位置添加此内容:
.Elements("interface")
.Where(i => null != i.Descendants("enabled").FirstOrDefault())
.Select // ...发布于 2014-01-11 08:16:52
Linq没有什么神奇之处(除了它是当前最流行的银弹)。在我看来,如果您使用XPath来选择您的元素集,那么您想要做什么会更容易,也可能更清楚。
使用XPath,它非常简单:
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]" ) ;应该注意的是,XmlNodeList是IEnumerable而不是IEnumerable<T>,所以要执行任何类型的Linq magick,您需要像这样转换它:
selectedNodes
.Cast<XmlNode>()
.Select( ... )
;https://stackoverflow.com/questions/21053260
复制相似问题