XML 具有复杂类型的混合内容模型 SSIS 错误
XML Mixed content model with complex types SSIS error
我有一份政府文件的 XML 文件和它引用的 XSD 文件。我正在尝试从 XML(化学名称、UN 和危险分类)中提取信息并将其存储到 table 中的 SQL Server 2014。但是,每当我执行 ETL使用 XML 源,使用 SSIS,我收到错误:The XML Source Adapter does not support mixed content model on Complex Types
。我该如何解决这个问题?我考虑并试图更好地理解的一些想法是:在 XML 上使用 XSLT 转换以仅保留相关信息或使用 C# 和 XPath 以仅 select 我想要的节点。但这已经变得比我原先想象的要难一些。任何帮助或指导表示赞赏。
http://www.gpo.gov/fdsys/bulkdata/CFR/2014/title-49/CFR-2014-title49-vol2.xml
http://www.gpo.gov/fdsys/bulkdata/CFR/resources/CFRMergedXML.xsd
试试这个
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication1
{
class Program
{
const string FILENAME = @"c:\temp\CFR-2014-title49-vol2.xml";
static void Main(string[] args)
{
XDocument doc = XDocument.Load(FILENAME);
XElement chapter = doc.Descendants("GPOTABLE").Where(x => x.Element("TTITLE") != null && x.Element("TTITLE").Value == "§ 172.101 Hazardous Materials Table").FirstOrDefault();
var results = chapter.Elements().Where(x => x.Name == "ROW" && x.Attribute("RUL") == null && (x.Elements("ENT").Count() == 14 || x.Elements("ENT").Count() == 2)).Select(y => new
{
chemical_name = y.Elements("ENT").Count() == 14 ? y.Elements("ENT").Skip(1).FirstOrDefault().Value
: y.Elements("ENT").Skip(1).FirstOrDefault().Value == ""
? string.Join("", y.Elements("ENT").Skip(1).FirstOrDefault().Descendants().Select(z => z.NextNode == null ? z.Value : z.Value + z.NextNode.ToString()).ToArray())
: string.Join("", y.Elements("ENT").Skip(1).FirstOrDefault().Value),
classification = y.Elements("ENT").Count() == 14 ? y.Elements("ENT").Skip(2).FirstOrDefault().Value : null,
UN = y.Elements("ENT").Count() == 14 ? y.Elements("ENT").Skip(3).FirstOrDefault().Value : null
}).Where(a => a.chemical_name.Length > 0).ToList();
}
}
}
我有一份政府文件的 XML 文件和它引用的 XSD 文件。我正在尝试从 XML(化学名称、UN 和危险分类)中提取信息并将其存储到 table 中的 SQL Server 2014。但是,每当我执行 ETL使用 XML 源,使用 SSIS,我收到错误:The XML Source Adapter does not support mixed content model on Complex Types
。我该如何解决这个问题?我考虑并试图更好地理解的一些想法是:在 XML 上使用 XSLT 转换以仅保留相关信息或使用 C# 和 XPath 以仅 select 我想要的节点。但这已经变得比我原先想象的要难一些。任何帮助或指导表示赞赏。
http://www.gpo.gov/fdsys/bulkdata/CFR/2014/title-49/CFR-2014-title49-vol2.xml http://www.gpo.gov/fdsys/bulkdata/CFR/resources/CFRMergedXML.xsd
试试这个
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication1
{
class Program
{
const string FILENAME = @"c:\temp\CFR-2014-title49-vol2.xml";
static void Main(string[] args)
{
XDocument doc = XDocument.Load(FILENAME);
XElement chapter = doc.Descendants("GPOTABLE").Where(x => x.Element("TTITLE") != null && x.Element("TTITLE").Value == "§ 172.101 Hazardous Materials Table").FirstOrDefault();
var results = chapter.Elements().Where(x => x.Name == "ROW" && x.Attribute("RUL") == null && (x.Elements("ENT").Count() == 14 || x.Elements("ENT").Count() == 2)).Select(y => new
{
chemical_name = y.Elements("ENT").Count() == 14 ? y.Elements("ENT").Skip(1).FirstOrDefault().Value
: y.Elements("ENT").Skip(1).FirstOrDefault().Value == ""
? string.Join("", y.Elements("ENT").Skip(1).FirstOrDefault().Descendants().Select(z => z.NextNode == null ? z.Value : z.Value + z.NextNode.ToString()).ToArray())
: string.Join("", y.Elements("ENT").Skip(1).FirstOrDefault().Value),
classification = y.Elements("ENT").Count() == 14 ? y.Elements("ENT").Skip(2).FirstOrDefault().Value : null,
UN = y.Elements("ENT").Count() == 14 ? y.Elements("ENT").Skip(3).FirstOrDefault().Value : null
}).Where(a => a.chemical_name.Length > 0).ToList();
}
}
}