1

私はこのようにxmlファイルの一部をシリアル化しました。今、いくつかのオブジェクトを削除したいex:名前コンポーネントを持つ画像が欲しい

<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>

だから、これを達成する方法を教えてください。いくつかの方法で試しましたが、達成できませんでした。助けてください...よろしくお願いします

4

3 に答える 3

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>
    

更新

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);
    }
}
于 2012-06-06T11:34:44.130 に答える
0

これは私のために働いた:

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

このライブラリを XPath に使用: https://github.com/ChuckSavage/XmlLib/

于 2012-06-06T12:30:47.660 に答える