如果属性包含XML中的特定字符串,如何跳过?

问题描述:

我得到所有的XML数据作为我的C#代码中的子节点,但我想跳过如果任何节点以“MARK”开头。只有没有“MARK”属性的节点才能被处理。请帮忙。如果属性包含XML中的特定字符串,如何跳过?

XML数据

<AWE.ini> 
    <NOTICES name="MARK_AB1-1"> 
    <Type> 
     CD 
    </Type> 
    </NOTICES> 
    <NOTICES name="CGX1_CF-1"> 
    <Type> 
     DF 
    </Type> 
    </NOTICES> 
    <NOTICES name="CGX2_CF-2"> 
    <Type> 
     DG 
    </Type> 
    </NOTICES> 
    <NOTICES name="MARK_AB2-1"> 
    <Type> 
     HJ 
    </Type> 
    </NOTICES> 
</AWE.ini> 

CSHARP代码

XmlDocument doc = new XmlDocument(); 
doc.Load("..\\AWE.xml"); 
XmlNodeList xnList = doc.SelectNodes("AWE.ini/NOTICES"); 
foreach (XmlNode xn in xnList) 
{ 
    if (xn.HasChildNodes) 
    {  
     foreach (XmlNode item in xn.ChildNodes) 
     { 
      m1.Type = xn.ChildNodes[0].InnerText.ToString(); 
     } 
    } 
} 
+0

你是不是应该开始'doc.SelectNodes( “AWE.ini /通知”)'代替'doc.SelectNodes(“AWE的.ini/MARK“)'? – grek40

+0

是的。谢谢。你是对的。这只是一个示例代码。所以只是作为例子写的。 –

您可以申请String.Contains()方法(见; https://msdn.microsoft.com/en-us/library/dy85x1sa(v=vs.110).aspx

在你的情况下,条件语句是这样的:

if (!m1.Type.Contains("MARK")) 
{ 
// your code 
} 

或者:

if (!xn.ChildNodes[0].InnerText.ToString().Contains("MARK")) 
{ 
// your code 
} 

此外,IndexOf()方法可以是检查是否string1包含string2有用。用法:if(string1.IndexOf(string2)>=0)

希望这可能有所帮助。

+0

谢谢Alex。 –

+0

不客气。祝你好运。 –

只需将条件添加到您的XPath中,即检查name属性的值。

XmlNodeList xnList = doc.SelectNodes("AWE.ini/NOTICES[not(starts-with(@name, 'MARK'))]"); 

只有这两个节点将被退回:

<NOTICES name="CGX1_CF-1"> 
    <Type> 
    DF 
    </Type> 
</NOTICES> 
<NOTICES name="CGX2_CF-2"> 
    <Type> 
    DG 
    </Type> 
</NOTICES>