如何读取忽略标题的xml字符串?

时间:2014-10-31 18:31:31

标签: c# xml xmldocument xmlreader

我想读取一个忽略标题和注释的xml字符串。

要忽略评论的简单,我找到了解决方案here。 但我没有找到任何解决方案来忽略标题。

让我举个例子:

考虑这个xml:

<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Some comments -->
<Tag Attribute="3">
    ...
</Tag>

我想把xml读成一个字符串,只获取元素&#34; Tag&#34;和其他元素,但不是&#34; xml版本&#34;和评论。

元素&#34;标记&#34;只是一个例子。可能存在很多其他人。

所以,我只想要这个:

<Tag Attribute="3">
    ...
</Tag>

我到目前为止的代码:

XmlReaderSettings settings = new XmlReaderSettings();
settings.IgnoreComments = true;
XmlReader reader = XmlReader.Create("...", settings);
xmlDoc.Load(reader);

我在XmlReaderSettings上找不到任何东西。

我是否需要逐节点选择我想要的节点?此设置不存在?

编辑1: 只是为了恢复我的问题。我需要在WebService的CDATA中使用xml的内容。当我发送评论或xml版本时,我收到了xml那部分的特定错误。所以我假设当我读取没有版本,标题和注释的xml时,我会很高兴。

3 个答案:

答案 0 :(得分:3)

这是一个非常简单的解决方案。

using (var reader = XmlReader.Create(/*reader, stream, etc.*/)
{
    reader.MoveToContent();
    string content = reader.ReadOuterXml();
}

答案 1 :(得分:1)

好吧,似乎没有设置可以忽略声明,所以我不得不自己忽略它。

以下是我为可能感兴趣的人编写的代码:

private string _GetXmlWithoutHeadersAndComments(XmlDocument doc)
{
    string xml = null;

    // Loop through the child nodes and consider all but comments and declaration
    if (doc.HasChildNodes)
    {
        StringBuilder builder = new StringBuilder();

        foreach (XmlNode node in doc.ChildNodes)
            if (node.NodeType != XmlNodeType.XmlDeclaration && node.NodeType != XmlNodeType.Comment)
                builder.Append(node.OuterXml);

        xml = builder.ToString();
    }

    return xml;
}

答案 2 :(得分:0)

如果您只想获取Tag元素,您应该正常读取XML,然后使用XmlDocument的XPath功能找到它们。

对于xmlDoc对象:

var nodes = xmlDoc.DocumentElement.SelectNodes("Tag");

然后你可以这样迭代:

foreach (XmlNode node in nodes) { }

或者,显然,如果你永远不会重用节点对象,你可以把你的SelectNodes查询放到foreach循环中。

这将返回XML文档中的所有Tag元素,并且您可以执行您认为适合的任何内容。

如果您不想使用XmlDocument,则无需遇到任何注释,并且您最终不会得到包括标题或注释的结果。在开始解析XML之前,是否有一个特殊原因要求删除XML?

编辑:根据您的编辑,当您尝试传递时,似乎您遇到了标题错误。您可能不应该直接删除标题,因此您最好的选择可能是将标题更改为您知道的标题。您可以像这样更改标题(声明):

XmlDeclaration xmlDeclaration;
xmlDeclaration = yourDocument.CreateXmlDeclaration(
                                  yourVersion, 
                                  yourEncoding, 
                                  isStandalone);
yourDocument.ReplaceChild(xmlDeclaration, doc.FirstChild);