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

本文关键字:xml 字符串 何读取 读取 | 更新日期: 2023-09-27 18:28:34

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

忽略评论很简单,我在这里找到了一个解决方案。但我找不到任何可以忽略标题的解决方案。

让我举一个例子:

考虑以下xml:

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

我想把xml读成一个字符串,只获得元素"Tag"和其他元素,但没有"xml版本"和注释。

元素"Tag"只是一个例子。可能还有很多其他的。

所以,我只想要这个:

<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时,我会很乐意阅读。

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

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

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

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

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

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

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

对于xmlDoc对象:

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

然后你可以像这样迭代:

foreach (XmlNode node in nodes) { }

或者,很明显,如果您永远不会重用nodes对象,您可以将SelectNodes查询放入foreach循环中。

这将返回XML文档中的所有Tag元素,您可以对它们执行任何您认为合适的操作。

如果您不想在使用XmlDocument时遇到注释,那么就不需要遇到注释,而且最终也不会得到包括标头或注释在内的结果。在开始解析XML之前,您试图删除它的部分,这有什么特别的原因吗?

编辑:根据你的编辑,当你试图传递邮件时,邮件头似乎出现了错误。你可能不应该直接删除邮件头,所以你最好的选择可能是将邮件头更改为你知道有效的邮件头。您可以这样更改标题(声明):

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