如何读取忽略标头的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时,我会很乐意阅读。
这里有一个非常简单的解决方案。
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);