Удаление полного узла из XML, хранящегося в переменной строкового типа, с использованием C # перед загрузкой в ​​XMLDocument - PullRequest
1 голос
/ 01 июня 2011

У меня есть приведенный ниже XML, который хранится в переменной строкового типа, и я использую .NET 2.0:

<?xml version="1.0"?>
<tcm:ListPublications xmlns:tcm="http://www.tridion.com/ContentManager/5.0" Managed="1">
    <tcm:Item ID="tcm:0-437-1" Title="05 Main Australia Web Site (English)"/>
    <tcm:Item ID="tcm:0-445-1" Title="06 Internal India Web Site (English)"/>
    <tcm:Item ID="tcm:0-437-1" Title="07 EKTA Australia Web Site (English)"/>
    <tcm:Item ID="tcm:0-445-1" Title="07 EKTA India Web Site (English)"/>
    <tcm:Item ID="tcm:0-414-1" Title="07 Bahrain web Site (Arabic)"/>
    <tcm:Item ID="tcm:0-272-1" Title="07 USA web Site (US English)"/>
    <tcm:Item ID="tcm:0-279-1" Title="08 Bahrain web Site (English)"/>
    <tcm:Item ID="tcm:0-392-1" Title="08 Belgium web Site (French)"/>
    <tcm:Item ID="tcm:0-321-1" Title="08 Brazil web Site (English)"/>
</tcm:ListPublications>

Теперь, прежде чем загрузить его в свой XMLDocument, я хочу загрузить только теУзлы "Item", которые имеют Title = "07" и не содержат в заголовке "EKTA".

И код C # для этого приведен ниже:

//Creating the object of PublicatinBL class.
PublicationBL pubBL = new PublicationBL();

//All publications list XML.
//Here I am getting the whole XML as shown above.
string pubListXML = pubBL.getAllPublicationListXML(); 

XmlDocument xDocument = new XmlDocument();

//Loading the publication list XML.
//Here before loading the XML, I want to modify it as required above.
xDocument.LoadXml(pubListXML);

1 Ответ

2 голосов
/ 01 июня 2011

Вы можете использовать LINQ to XML :

var xdocument = XDocument.Parse(xml);

var nodes = xdocument.Descendants(XName.Get("Item", "http://www.tridion.com/ContentManager/5.0"))
    .Where(arg => arg.Attribute("Title").Value.Contains("07") && !arg.Attribute("Title").Value.Contains("EKTA"))
    .ToList();

Или с синтаксисом LINQ:

var nodes = (
    from node in xdocument.Descendants(XName.Get("Item", "http://www.tridion.com/ContentManager/5.0"))
    let titleAttribute = node.Attribute("Title").Value
    where titleAttribute.Contains("07") && !titleAttribute.Contains("EKTA")
    select node)
    .ToList();

[Обновить] После .NET 2 былуказано в вопросе.

В .NET 2 вы можете использовать XPath:

XmlNamespaceManager xmlnsManager = new XmlNamespaceManager(xmlDocument.NameTable);
xmlnsManager.AddNamespace("tcm", "http://www.tridion.com/ContentManager/5.0");
XmlNodeList nodes = xmlDocument.SelectNodes(
    "//tcm:ListPublications//tcm:Item[contains(@Title,'07') and not(contains(@Title,'EKTA'))]",
    xmlnsManager);
...