2012-06-06 2 views
1

у меня есть мыло сериализованной часть XML-файл, как это, Теперь я хочу некоторые из объектов будет удалить пример: я хочу изображение с именем компонентомXpath запроса для удаления узлов

<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:clr="http://schemas.microsoft.com/soap/encoding/clr/1.0" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 
<SOAP-ENV:Body> 
<a1:Image id="ref-1" xmlns:a1="http://schemas.microsoft.com/clr/nsassem/Spo.DataModel/Spo.DataModel%2C%20Version%3D12.1.3.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D23bd062a94e26d58"> 
<Name id="ref-4">Component</Name> 
<ImmediateState xsi:type="a2:ModifiedState" xmlns:a2="http://schemas.microsoft.com/clr/nsassem/Spo.Plugins/Spo.DataModel%2C%20Version%3D12.1.3.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D23bd062a94e26d58">Current</ImmediateState> 
</a1:Image> 
</SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 
<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:clr="http://schemas.microsoft.com/soap/encoding/clr/1.0" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 
<SOAP-ENV:Body> 
<a1:Image id="ref-1" xmlns:a1="http://schemas.microsoft.com/clr/nsassem/Spo.DataModel/Spo.DataModel%2C%20Version%3D12.1.3.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D23bd062a94e26d58"> 
<Name id="ref-4">Connect</Name> 
<ImmediateState xsi:type="a2:ModifiedState" xmlns:a2="http://schemas.microsoft.com/clr/nsassem/Spo.Plugins/Spo.DataModel%2C%20Version%3D12.1.3.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D23bd062a94e26d58">Current</ImmediateState> 
</a1:Image> 
</SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

Так предоставьте мне некоторые идеи, как добиться этого, я попытался несколько способов мне не удалось добиться, пожалуйста, помогите мне, пожалуйста ... заранее спасибо

+0

Привет я придумал другую потребность как сейчас я нахожусь в состоянии удалить узлы на основе имени значения As мое сериализованное сечением xml не имеет корневых узлов, которые я использовал StreamReader Sr = новый StreamReader (имя файла); XDocument doc = XDocument.Parse ("" + Sr.ReadToEnd() + ""); после того, как я удаляю узлы в документе, я могу сэкономить с doc.save (filename); , который сохраняет ........ Я не хочу, чтобы это было спасено, потому что я не смогу их отреагировать снова ... , пожалуйста, помогите мне, как я могу достичь этого заранее заранее – user1439419

ответ

0
  1. Вы можете использовать XSLT, как это:

    <xsl:template match="spo:Image | Name | spo:Image/@id | Name/@id | Name/text()"> 
        <xsl:copy> 
         <xsl:apply-templates select="@* | node()"/> 
        </xsl:copy> 
    </xsl:template> 
    
    <xsl:template match="@* | node()"> 
        <xsl:apply-templates select="@* | node()"/> 
    </xsl:template> 
    

  2. Linq2Xml:

    var doc = XDocument.Parse(xml); 
        var elementName = XName.Get(
         "Image", 
         "http://schemas.microsoft.com/clr/nsassem/Spo.DataModel/Spo.DataModel%2C%20Version%3D12.1.3.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D23bd062a94e26d58"); 
        var items = 
         from x in doc.Descendants().Elements(elementName) 
         select new { ImageId = x.Attribute("id").Value, NameId = x.Element("Name").Attribute("id").Value, Name = x.Element("Name").Value }; 
    
  3. XPath (XDocument):

    var doc = XDocument.Parse(xml); 
    
    var navigator = doc.CreateNavigator(); 
    var manager = new XmlNamespaceManager(navigator.NameTable); 
    manager.AddNamespace("spo", "http://schemas.microsoft.com/clr/nsassem/Spo.DataModel/Spo.DataModel%2C%20Version%3D12.1.3.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D23bd062a94e26d58"); 
    var sel = navigator.Select("//descendant::spo:Image", manager); 
    
    foreach (XPathNavigator node in sel) 
    { 
        Console.WriteLine(node.OuterXml); 
    } 
    
  4. XPath (XSLT):

    <xsl:template match="*"> 
        <xsl:for-each select="/descendant::spo:Image"> 
         <xsl:copy> 
          <xsl:copy-of select="Name"/> 
         </xsl:copy> 
        </xsl:for-each> 
    </xsl:template> 
    

Update:

var xml = string.Format(@"<root>{0}</root>", Resource1.String1); 
var doc = XDocument.Parse(xml); 
// process document 
using (var file = File.CreateText(@"file.xml")) 
{ 
    foreach (XElement nodes in doc.Root.Elements()) 
    { 
     file.Write(nodes); 
    } 
} 
+0

xmlns: spo = "http://schemas.microsoft.com/clr/nsassem/Spo.DataModel/Spo.DataModel%2C%20Version%3D12 .1.3.0% 2C% 20Culture% 3Dneutral% 2C% 20PublicKeyToken% 3D23bd062a94e26d58 " –

+0

Привет большое спасибо .. Я хочу продолжить решение 2 или 3, но я хочу, чтобы запрос был независимым от пространства имен, так что, пожалуйста, это заранее. – user1439419

+0

3) var sel = навигатор.Выберите ("// descendant :: * [local-name() = 'Image']"); –

0

Это работает для меня:

XElement root = XElement.Load(file); 
IEnumerable<XElement> images = root.XPath("//Image[Name]"); 

Используя эту библиотеку XPath: https://github.com/ChuckSavage/XmlLib/

+0

Я получаю ошибку, как это для решения ур «System.Xml.Linq.XElement» не содержит определения для «XPath» и никакого метода расширения «XPath», принимающего первый аргумент типа «System.Xml.Linq. XElement 'можно найти (если вы не указали директиву или ссылку на сборку?) , пожалуйста, предложите мне, если я ошибаюсь ... – user1439419

+0

Это потому, что вы либо не загрузили библиотеку, либо не добавили ссылку в dll в каталоге bin/debug или добавить 'using XmlLib;' в ваш файл класса. Нажмите кнопку Zip рядом с верхней частью, чтобы получить загрузку библиотеки в виде zip-файла. –

+0

Привет, я пришел с другой необходимостью, так как теперь я могу удалить узлы на основе значения имени. Поскольку мое сериализованное сечение xml не имеет корневых узлов, я использовал StreamReader Sr = новый StreamReader (имя файла); XDocument doc = XDocument.Parse ("" + Sr.ReadToEnd() + ""); после удаления узлов в документе я могу сэкономить с doc.save (filename); который сохраняет ........ Я не хочу, чтобы это было спасено, потому что я не смогу повторить его снова. .. Пожалуйста, помогите мне, как я могу это заранее заблаговременно – user1439419

0

Используйте этот XSLT преобразование:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="*[local-name() = 'Image' and Name]"/> 
</xsl:stylesheet> 
+0

Привет, я пришел с другой необходимостью, так как теперь я могу удалить узлы на основе значения имени. Поскольку мое сериализованное сечение xml не имеет корневых узлов, я использовал StreamReader Sr = новый StreamReader (имя файла); XDocument doc = XDocument.Parse ("" + Sr.ReadToEnd() + ""); после удаления узлов в документе я могу сэкономить с doc.save (filename); который сохраняет ........ Я не хочу, чтобы это было спасено, потому что я не смогу повторить его снова. .. Пожалуйста, помогите мне, как я могу это заранее заблаговременно – user1439419

+0

@ user1439419: Из вашего комментария неясно: «... я не хочу, чтобы это было спасено». Что здесь означает «это»? Что ты не хочешь? –

+1

OP должен отметить этот ответ как разрешенный и задать другой вопрос. –

Смежные вопросы