簡體   English   中英

如何讀取一些XML然后拆分.NET中的各種節點/元素?

[英]How to read in some XML then split out various nodes/elements in .NET?

我有一些xml(在一個文件中,但可以是一個字符串),我需要解析,例如:

var xmlDocument = new XmlDocument();
xmlDocument.LoadXml(xmlText);

給出以下XML:

<foo>
    <cat>...</cat>
    <cat>...</cat>
    <dog>...</dog>
    <cat>...</cat>
    <dog>...</dog>
</foo>

我不確定如何提取所有catdog元素並將它們放入以下輸出中: -

<foo>
    <cat>...</cat>
    <cat>...</cat>
    ....
</foo>

和狗一樣

提取這些節點並將它們放入單獨的XMLDocuments的訣竅是什么。

使用Linq到XML,因為它有一個更好的API。

var doc = XElement.Parse(
@"<foo>
    <cat>...</cat>
    <cat>...</cat>
    <dog>...</dog>
    <cat>...</cat>
    <dog>...</dog>
</foo>");
doc.Descendants("dog").Remove();

doc現在包含這個:

<foo>
    <cat>...</cat>
    <cat>...</cat>
    <cat>...</cat>
</foo>

編輯:

雖然Linq to XML本身提供了一個很好的API來處理XML,但Linq的強大功能及其投影功能使您可以根據需要調整數據的形狀。

例如,考慮一下。 這里的后代元素按名稱分組並投影到新的root元素中,然后將其包裝到XDocument 請注意,這會創建一個可枚舉的XDocument

var docs= 
    from d in doc.Descendants()
    group d by d.Name into g
    select new XDocument(
        new XElement("root", g)
    );

docs現在包含:

<root>
    <cat>...</cat>
    <cat>...</cat>
    <cat>...</cat>
</root>
---
<root>
    <dog>...</dog>
    <dog>...</dog>
</root> 

哦,順便說一下。 Descendants方法遍歷所有后代元素,如果您只想要直接子元素,則使用Elements

以下是MSDN上Linq to XML文檔

最簡單的方法是使用XSLT並將其應用於XMLDocument ,這樣您就不會修改源並擁有所需的輸出。

應用轉換的代碼是

    XslCompiledTransform xslTransform = new XslCompiledTransform();
    StringWriter writer = new StringWriter();          
    xslTransform.Load("cat.xslt");
    xslTransform.Transform(doc.CreateNavigator(),null, writer);
    return writer.ToString();

而簡單的cat.xslt就是

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="foo">
        <xsl:copy>
            <xsl:copy-of select = "cat" />
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

由於您使用的是XmlDocument :從同一文件加載兩次並刪除不需要的節點。 這是一個鏈接,向您展示如何: 從XmlDocument中刪除節點

var xmlDocument = new XmlDocument();
xmlDocument.LoadXml(xmlText);
XmlNode root = doc.DocumentElement;
nodeList = root.SelectNodes("//cat");

foreach (XmlNode node on nodeList)
{
  root.RemoveChild(node);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM