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/8/svg/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# IEnumerable<;对象[]>;不返回丢失的或空的XML元素_C#_Xml_Linq To Xml_Ienumerable - Fatal编程技术网

C# IEnumerable<;对象[]>;不返回丢失的或空的XML元素

C# IEnumerable<;对象[]>;不返回丢失的或空的XML元素,c#,xml,linq-to-xml,ienumerable,C#,Xml,Linq To Xml,Ienumerable,在这个当前的项目中,我正在阅读1000-1700个XML文件并提取信息。我目前面临的问题是,并非所有的XML都是干净的。有些缺少IEnumerable正在查找的关键元素,或者数据只是空值。我的问题是我无法解释这些缺失或空值。我试过string.Empty和string.IsNullOrEmpty但是intellisense不喜欢它。我的思维过程是,如果元素缺失或返回null,则将这些值设置为等于“NA”。我的思维方式有问题吗 private static IEnumerable<objec

在这个当前的项目中,我正在阅读1000-1700个XML文件并提取信息。我目前面临的问题是,并非所有的XML都是干净的。有些缺少IEnumerable正在查找的关键元素,或者数据只是空值。我的问题是我无法解释这些缺失或空值。我试过
string.Empty
string.IsNullOrEmpty
但是intellisense不喜欢它。我的思维过程是,如果元素缺失或返回null,则将这些值设置为等于“NA”。我的思维方式有问题吗

private static IEnumerable<object[]> GetDocumentsData(string folderPath = @"filepath")
{

return Directory.GetFiles(folderPath, "*.xml")
.Select(XDocument.Load)
.SelectMany(file => file.Descendants().Where(e => e.Name.LocalName == "FilingLeadDocument")
.Concat(file.Descendants().Where(e => e.Name.LocalName == "FilingConnectedDocument")))
.Select(documentNode =>
{
try
{
var receivedDateNode = documentNode.Elements().FirstOrDefault(e => e.Name.LocalName == "DocumentReceivedDate");
var SequenceNode = documentNode.Elements().FirstOrDefault(e => e.Name.LocalName == "DocumentSequenceID");
var descriptionNode = documentNode.Elements().FirstOrDefault(e => e.Name.LocalName == "DocumentDescriptionText");
var metadataNode = documentNode.Elements().FirstOrDefault(e => e.Name.LocalName == "DocumentMetadata");
var registerActionNode = metadataNode.Elements().FirstOrDefault(e => e.Name.LocalName == "RegisterActionDescriptionText");

return new object[]
{
(string)documentNode.Parent.Parent.Elements().FirstOrDefault(e => e.Name.LocalName == "DocumentIdentification"),
SequenceNode != null ? SequenceNode.Value.Trim() : string.Empty,
(DateTime?)receivedDateNode.Elements().FirstOrDefault(e => e.Name.LocalName == "DateTime"),
descriptionNode != null ? descriptionNode.Value.Trim() : string.Empty,
registerActionNode != null ? registerActionNode.Value.Trim() : string.Empty
};
}
catch (Exception e)
{
//Log.error("");
return new object[] { };
}
}).ToArray();
}

假设你要求这样做,我错了吗:

return new object[]
{
(string)documentNode.Parent.Parent.Elements().FirstOrDefault(e => e.Name.LocalName == "DocumentIdentification"),
SequenceNode != null ? SequenceNode.Value.Trim() : "NA",
(DateTime?)receivedDateNode.Elements().FirstOrDefault(e => e.Name.LocalName == "DateTime"),
descriptionNode != null ? descriptionNode.Value.Trim() : "NA",
registerActionNode != null ? registerActionNode.Value.Trim() : "NA"
};

为了解析这个xml,在按名称搜索元素时必须处理名称空间。因此,您应该做的第一件事是获取您需要的名称空间:

var xdoc = XDocument.Load(fileName);
var ns = xdoc.Root.GetDefaultNamespace();
XNamespace ecf = "urn:oasis:names:tc:legalxml-courtfiling:schema:xsd:CommonTypes-4.0";
XNamespace nc = "http://niem.gov/niem/niem-core/2.0";
XNamespace s = "http://niem.gov/niem/structures/2.0";
XNamespace cfm = "urn:oasis:names:tc:legalxml-courtfiling:schema:xsd:CoreFilingMessage-4.0";
接下来需要将元素的全名传递给Linq方法,而不是按本地名称搜索(请记住,Linq方法接受元素的
XName
,而不是简单的字符串)。因此,如果您需要
文件添加文档
及其内容

var fld = xdoc.Root.Element(ns + "RecordFilingRequestMessage")
              .Element(cfm + "CoreFilingMessage")
              .Element(cfm + "FilingLeadDocument");
接下来是读取可能丢失的元素的值。如果要使用
Value
属性,则会得到
NullReferenceException
。所以,您应该使用元素的强制转换。例如,转换为字符串将返回元素值,如果未找到元素,则返回
null

var fillingLeadDoc = new FillingLeadDoc {
    ReceivedDate = (DateTime?)fld.Elements(nc + "DocumentReceivedDate")
                                 .Elements(nc + "DateTime").FirstOrDefault(),
    SequenceId = (int?)fld.Element(nc + "DocumentSequenceID"),
    DescriptionText = (string)fld.Element(nc + "DocumentDescriptionText")
};
其中,
FillingLeadDoc
是类

public class FillingLeadDoc
{
    public int? SequenceId { get; set; }
    public DateTime? ReceivedDate { get; set; }
    public string DescriptionText { get; set; }
}
对于示例xml,将创建以下实例:

{
  SequenceId: 1,
  ReceivedDate: "2014-05-28T00:50:51.297+03:00",
  DescriptionText: "CLASS EMPTY-CS-AAADH6K-CE- 1AAADH6K"
}
将此代码移动到某些
GetFillingLeadDoc
方法:

private static FillingLeadDoc GetFillingLeadDoc(string fileName)
{
    // code above
    return fillingLeadDoc;
}
并为每个文件调用此方法:

private static IEnumerable<FillingLeadDoc> GetDocumentsData(
   string folderPath = @"filepath")
{
   return Directory.GetFiles(folderPath, "*.xml")
                   .Select(GetFillingLeadDoc);
}
私有静态IEnumerable GetDocumentsData(
字符串folderPath=@“文件路径”)
{
返回目录.GetFiles(folderPath,*.xml)
.选择(GetFillingLeadDoc);
}

然后将网格绑定到这些文档。

您在谈论什么xml?以下哪一行您有问题?@SergeyBerezovskiy ReceivedDataNode、SequenceNode、descriptionNode、registerActionNode不总是在XML中,但如果是,我发现值为空。我正在试图找出如何适应缺少的元素或值为null的位置。您能提供示例xml并解释您要提取的数据吗?@SergeyBerezovskiy我现在添加了xml。谢谢。我打赌在xml中应该有名称空间nc、ecf的定义。您确定粘贴了整个xml吗?如果元素根本不在xml中会发生什么情况?@clerktech哪个元素?您真是太棒了!!!我现在就开始修改我的整个程序,以合并您的代码。为什么有一百万种不同的方式来读取XML?哪种方式是正确的?我目前的方法好吗?@clerktech基本上有两种方法——顺序读取xml(XmlReader),而不构建xml树的内存表示,以及通过构建树加载所有xml(XmlDocument和XDocument,后者取代了旧的)。所以,如果文件不是很大,您的方法完全可以。谢谢。我现在就去。我感谢您在XML问题上给予我的所有帮助。我从我缺乏的知识中学到了一些东西。当XML中的元素一起丢失时,分配NULL的过程是什么?
private static IEnumerable<FillingLeadDoc> GetDocumentsData(
   string folderPath = @"filepath")
{
   return Directory.GetFiles(folderPath, "*.xml")
                   .Select(GetFillingLeadDoc);
}