C# XmlReader按原样返回没有子节点的节点
我正在使用C# XmlReader按原样返回没有子节点的节点,c#,xml,xmlreader,C#,Xml,Xmlreader,我正在使用XmlReader遍历一个大型XML文档,并将其缝合成一个更小、更易于管理的XmlDocmuent。一路上,我发现了一个有趣的节点,所以要移动它,我会这样做: targetDoc.LoadXml("<result></result>"); // Some interesting code removed using (XmlReader r = XmlReader.Create(file)) {
XmlReader
遍历一个大型XML文档,并将其缝合成一个更小、更易于管理的XmlDocmuent
。一路上,我发现了一个有趣的节点,所以要移动它,我会这样做:
targetDoc.LoadXml("<result></result>");
// Some interesting code removed
using (XmlReader r = XmlReader.Create(file))
{
while (r.Read())
{
if (r.NodeType == XmlNodeType.Element)
{
if (r.Name == match)
{
// Put the node into the target document
targetDoc.FirstChild.InnerXml = r.ReadOuterXml();
return targetDoc;
}
}
}
}
targetDoc.LoadXml(“”);
//删除了一些有趣的代码
使用(XmlReader r=XmlReader.Create(文件))
{
while(r.Read())
{
if(r.NodeType==XmlNodeType.Element)
{
if(r.Name==匹配)
{
//将节点放入目标文档中
targetDoc.FirstChild.InnerXml=r.ReadOuterXml();
返回targetDoc;
}
}
}
}
这一切都很好,除了我想包括没有其后代的节点。我感兴趣的是节点本身及其属性。在这一点上,后代是非常庞大、笨重和乏味的。(同时将它们全部读入内存将导致内存不足错误…)
有没有一种简单的方法可以将找到的元素的文本(?)及其属性(而不是其后代)放入目标文档中?您可以尝试XmlNode.CloneNode(bool deep)方法
deep:true,递归克隆指定节点下的子树;false仅克隆节点本身 这不一定是一个好方法,但是您可以读取字符串,直到到达开始标记的末尾,然后手动附加一个结束标记并将其加载到XmlDocument中 编辑: 思考如下:
string xml = r.ReadOuterXml();
int firstEndTag = xml.IndexOf('>');
int lastStartTag = xml.LastIndexOf('<');
string newXml = xml.Substring(0, firstEndTag) + xml.Substring(lastStartTag);
stringxml=r.ReadOuterXml();
int firstEndTag=xml.IndexOf('>');
int lastStartTag=xml.LastIndexOf(“我不认为有一种内置的方法可以做到这一点。我认为您必须自己读取属性和内容
e、 g
static void Main(字符串[]args)
{
var xml=@”
一些父文本
一些子文本
";
var file=新的StringReader(xml);
使用(XmlReader r=XmlReader.Create(文件))
{
while(r.Read())
{
if(r.NodeType==XmlNodeType.Element)
{
如果(r.Name==“父项”)
{
var输出=新的StringBuilder();
var设置=新的XmlWriterSettings();
settings.OmitXmlDeclaration=true;
使用(var elementWriter=XmlWriter.Create(输出、设置))
{
elementWriter.WriteStarElement(r.Name);
elementWriter.WriteAttributes(r,false);
elementWriter.WriteValue(r.ReadString());
elementWriter.WriteEndElement();
}
Console.WriteLine(output.ToString());
}
}
}
}
if(System.Diagnostics.Debugger.IsAttached)
Console.ReadLine();
}
将产生
<parent a1="foo" a2="bar">Some Parent text</parent>
Press any key to continue . . .
一些父文本
按任意键继续。
您不应该使用新建XmlTextReader()
。而是使用XmlReader.Create()
。它实际上是作为外部函数的参数传递的(未显示)我希望我能得到一个有用的答案。试着帮助那些不知道如何复制/粘贴他们在这里看到的代码的人。他没有可以克隆的XmlNode,因为后代太大了。我想到了类似这样的东西:if(r.HasAttributes)for(inti=0;i
,然后按照您的建议为节点重新生成XML,但这看起来……很糟糕。
<parent a1="foo" a2="bar">Some Parent text</parent>
Press any key to continue . . .