我想读取一个忽略标题和注释的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时,我会很高兴。
答案 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);