.net C#拆分xml文件

.net C#拆分xml文件,c#,.net,xml,C#,.net,Xml,我使用代码项目中的代码将xml文件拆分为多个文件。在下面这种情况下,它可以正常工作:“Registrations”是父节点,当split在“Registration”之间时 108260 ................... .................. 108260 ................... .................. 108260 ................... .................. 但是当XML文件采用这种格式时,代码不起作用

我使用代码项目中的代码将xml文件拆分为多个文件。在下面这种情况下,它可以正常工作:“Registrations”是父节点,当split在“Registration”之间时


108260
...................
..................
108260
...................
..................
108260
...................
..................

但是当XML文件采用这种格式时,代码不起作用:“RegistrationPendata”是根节点,然后还有另一个节点“Registrations”,必须在“Registration”之间进行拆分


......
..........
...............
...........
................
108260
...................
..................
108260
...................
..................
108260
...................
..................
我使用的代码如下所示:

private void按钮点击(对象发送者,事件参数e)
{
字符串sourceFile=@“D:\sample.xml”;
字符串rootElement=“RegistrationPendata”;
字符串descElement=“注册”;
int-take=1;
字符串destFilePrefix=“RegistrationsPart”;
字符串destPath=@“D:\PART\”;
SplitXmlFile(sourceFile、rootElement、descElement、take、,
destFilePrefix,destPath);
}
私有静态void SplitXmlFile(字符串源文件
,字符串根元素
,字符串子元素
,int-takeElements
,字符串destFilePrefix
,字符串(路径)
{          
XElement xml=XElement.Load(sourceFile);
//源文件中要拆分的子元素。
var childNodes=xml.subjects(后代元素);
//这是要切片到的元素总数
//单独的文件。
int cnt=childNodes.Count();
var-skip=0;
var-take=take元素;
var fileno=0;
//将元素分割成块并保存到磁盘。
while(跳过
我刚刚在VS 2015中测试了您的代码,它似乎可以工作。它生成3个XML文件,包含以下内容:

<?xml version="1.0" encoding="utf-8"?>
<RegistrationOpenData>
  <Registration>
    <RegistrationID>108260</RegistrationID>
  </Registration>
</RegistrationOpenData>

108260
这是你期待的吗?您可以提供有关您的问题的更多详细信息吗?

作为快速解决方案(我假设您不想更改codeproject脚本),您可以添加以下行:

private static void SplitXmlFile(string sourceFile
                    , string rootElement
                    , string descendantElement
                    , int takeElements
                    , string destFilePrefix
                    , string destPath)
{ 
    XElement xml = XElement.Load(sourceFile);
    XNamespace ns = "http://services.hpd.gov"; // This line must be added.
    xml = xml.Element(ns + rootElement); // rootElement must be "Registrations". And also this line must be added.
    // Child elements from source file to split by.
    var childNodes = xml.Descendants(ns + descendantElement);
.....
.....

这是一个工作示例:

XElement。子体的结果是递归的。我想您实际上可能在寻找
XElement.Elements
我尝试使用var childNodes=xml.Elements(“注册”);而不是var childNodes=xml.subjects(genderantelement);但它仍然不起作用。没有给出结果。你能显示你期望达到的输出吗?我在这个问题中指定的第一种格式是期望的输出。我尝试了这个修改,但仍然不起作用。我正在使用VS2012。我希望不是这样。在我的例子中,代码childNodes.Count()返回0,因此它甚至没有进入while循环。您好,我在fiddle中尝试了它,它正在进入循环。我刚刚检查了fiddle,它工作正常。我想知道这是通过路径而不是字符串值传递xml文件的正确方法,如下所示:xmlReader=xmlReader.Create(newStringReader(@“D:\sample.xml”);在您刚才提供的fiddle链接中使用这行代码时,我遇到以下错误:根级别的数据无效。第1行,位置1。这是sample.xml文件的链接:我正在使用VS 2012。我在这个问题中指定的第一种格式是预期输出。如果从XML文件父节点“RegistrationPendata”中删除,则代码工作正常,文件被拆分。但是,如果“注册数据”和“注册”都存在,则什么也不会发生。没有错误,没有分裂。
<?xml version="1.0" encoding="utf-8"?>
<RegistrationOpenData>
  <Registration>
    <RegistrationID>108260</RegistrationID>
  </Registration>
</RegistrationOpenData>
private static void SplitXmlFile(string sourceFile
                    , string rootElement
                    , string descendantElement
                    , int takeElements
                    , string destFilePrefix
                    , string destPath)
{ 
    XElement xml = XElement.Load(sourceFile);
    XNamespace ns = "http://services.hpd.gov"; // This line must be added.
    xml = xml.Element(ns + rootElement); // rootElement must be "Registrations". And also this line must be added.
    // Child elements from source file to split by.
    var childNodes = xml.Descendants(ns + descendantElement);
.....
.....