Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XmlReader按原样返回没有子节点的节点_C#_Xml_Xmlreader - Fatal编程技术网

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 . . .