Как в файле схемы XML / XSD извлечь (проанализировать) определенную информацию из элемента? - PullRequest
0 голосов
/ 29 сентября 2019

Есть ли способ анализа определенных данных из файла XML и вывода этой информации в файл excel (csv)?Вместо того, чтобы вручную просматривать XML-файлы и обновлять их в листе Excel, я задаюсь вопросом, может ли это быть автоматизировано в приложении C # .NET.Так что, если у меня много XML-файлов, я могу запустить приложение, чтобы получить нужную информацию.

Например, допустим, что в файле XML есть этот элемент:

<element type="xpowercomponent_FeaturedTiles" UID="40204fc9b5424b349e03134d777d29bc" label="Featured Tiles" readonly="false" hidden="false" default="" required="false" Component="" CompTypes="ThemedTileSetComponent;ThemedTileSetElectedComponent;" AutoEmbed="" WrappedUp="" AllowWrappingChange="" />

Данные, которые я пытаюсь извлечь из каждого элемента в файле XML,, element: Type, label, CompTypes, только для чтения, скрытый, обязательный.

Я пытался сделать следующее, но я не уверен, что этот подход работает, поскольку я не слишком знаком с работой с XML.

static void Main(string[] args)
    {
        XmlSchemaSet schemas = new XmlSchemaSet();
        schemas.Add("", XmlReader.Create(new StringReader(File.ReadAllText("Schema.xsd"))));
        schemas.Compile();
        AnalyseSchema(schemas);
        Console.ReadLine();
    }
}

XmlSchema customerSchema = null;
        foreach (XmlSchema schema in set.Schemas())
        {
            customerSchema = schema;
        }

Вот полный файл схемы XML:

<Schema xmlns:dt="urn:schemas-microsoft-com:datatypes" name="TopTier" xmlns="urn:schemas-microsoft-com:xml-data">
  <AttributeType name="ID" dt:type="id" required="yes" />
  <AttributeType name="Name" dt:type="string" required="yes" />
  <AttributeType name="UniqueID" dt:type="int" default="schemas/107" />
  <AttributeType name="Icon" dt:type="int" default="2" />
  <AttributeType name="FriendlyName" dt:type="string" default="Top Tier" />
  <AttributeType name="SS" dt:type="boolean" default="true" />
  <AttributeType name="DSS" dt:type="boolean" default="true" />
  <AttributeType name="ViewName" dt:type="" default="" />
  <AttributeType name="DefaultCategorization" dt:type="string" default="" />
  <AttributeType name="Version" dt:type="int" default="9" />
  <ElementType name="Exports" content="textOnly" />
  <ElementType name="Title" dt:type="string" content="textOnly" />
  <ElementType name="Excerpt" dt:type="string" content="textOnly">
    <description>This info is used to display on pages that link to this page.</description>
  </ElementType>
  <ElementType name="ThumbnailImage" dt:type="imagefile" content="textOnly">
    <description>Thumbnail dimension should be 75 x 75 pixels.</description>
  </ElementType>
  <ElementType name="xhtml_BodyCopy" content="textOnly" />
  <ElementType name="xpowerlist_LeftSidebarComponentsOverride" content="eltOnly" />
  <ElementType name="xpowercomponent_LeftSidebarComponent" content="eltOnly" />
  <ElementType name="xpowercomponent_FeaturedTiles" content="eltOnly" />
  <ElementType name="SecondaryTitle" dt:type="string" content="textOnly" />
  <ElementType name="xpowerlist_SecondaryComponentList" content="eltOnly" />
  <ElementType name="xpowercomponent_SecondaryItem" content="eltOnly" />
  <ElementType name="xpowergroupstart_SEOGroup" content="eltOnly">
    <description>Search Engine Optimization Group</description>
  </ElementType>
  <ElementType name="BrowserTitle" dt:type="string" content="textOnly" />
  <ElementType name="MetaDescription" dt:type="string" content="textOnly" />
  <ElementType name="NoIndex" dt:type="boolean" content="textOnly" />
  <ElementType name="NoFollow" dt:type="boolean" content="textOnly" />
  <ElementType name="NoODP" dt:type="boolean" content="textOnly" />
  <ElementType name="Priority" dt:type="enumeration" values="0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0" content="textOnly" />
  <ElementType name="PublishDate" dt:type="localdate" content="textOnly" />
  <ElementType name="xpowergroupend_" content="eltOnly" />
  <ElementType name="xpowernavigation_BreadcrumbNavigation" content="eltOnly" />
  <ElementType name="xpowercomponent_SectionControl" content="eltOnly" />
  <ElementType name="TopTier" content="eltOnly" order="seq">
    <attribute type="ID" />
    <attribute type="Name" />
    <element type="Title" UID="2bbcb2816ba743e2bd935d526f47d688" label="Title" readonly="false" hidden="false" default="" required="true" />
    <element type="Excerpt" UID="2ac3ade7d9c34cae8a7f304d9754db86" label="Excerpt" readonly="false" hidden="false" default="" required="true" />
    <element type="ThumbnailImage" UID="f4940dbfe27f4783a97c356f3ba0f959" label="Thumbnail Image" readonly="false" hidden="false" default="" required="false" Expanded="false" Width="" Height="" Border="" HSpace="" VSpace="" Alignment="" AlternateText="" />
    <element type="xhtml_BodyCopy" UID="055d4709ffb24402a14f9d13af417401" label="Body Copy" readonly="false" hidden="false" default="" required="false" Height="" />
    <element type="xpowerlist_LeftSidebarComponentsOverride" UID="1d281fa780b6419089c52913640ade93" label="Left Sidebar Components Override" readonly="false" hidden="false" default="" required="false" Enclosed="" AllowEnclosureChange="" List="xpowercomponent_LeftSidebarComponent" Component="" CompTypes="" AutoEmbed="" WrappedUp="" AllowWrappingChange="" />
    <element type="xpowercomponent_FeaturedTiles" UID="40204fc9b5424b349e03134d777d29bc" label="Featured Tiles" readonly="false" hidden="false" default="" required="false" Component="" CompTypes="ThemedTileSetComponent;ThemedTileSetElectedComponent;" AutoEmbed="" WrappedUp="" AllowWrappingChange="" />
    <element type="SecondaryTitle" UID="3d00fbe341ff4f2481c6199deb046997" label="Secondary Title" readonly="false" hidden="false" default="" required="false" />
    <element type="xpowerlist_SecondaryComponentList" UID="3bc6293a826a4f2081dca1c5e1415978" label="Secondary Component List" readonly="false" hidden="false" default="" required="false" Enclosed="" AllowEnclosureChange="" List="xpowercomponent_SecondaryItem" Component="" CompTypes="TaxonomyTileComponent;ServiceComponent;ContactComponent;TitledCollection" AutoEmbed="" WrappedUp="" AllowWrappingChange="" />
    <element type="xpowergroupstart_SEOGroup" UID="bf312bbd47d74c758d13695b8fa011c0" label="SEO Group" readonly="false" hidden="true" default="" required="false" Enclosed="" AllowEnclosureChange="" />
    <element type="BrowserTitle" UID="c777f36e6f094b50a04692d3bfef387e" label="Browser Title" readonly="false" hidden="false" default="" required="false" />
    <element type="MetaDescription" UID="05bab416415541beb05e90b94f7e5248" label="Meta Description" readonly="false" hidden="false" default="" required="false" />
    <element type="NoIndex" UID="e224c1a3aaa846d9b19579d59d9b1af7" label="No Index" readonly="false" hidden="false" default="" required="false" />
    <element type="NoFollow" UID="b40ae068c0d749c4bb8ecd589388bb1b" label="No Follow" readonly="false" hidden="false" default="" required="false" />
    <element type="NoODP" UID="2557027d711d41c3b3ccbd3aab4650dd" label="No ODP" readonly="false" hidden="false" default="" required="false" />
    <element type="Priority" UID="f49eec4e94864e03aedbd0e2be6a2822" label="Priority" readonly="false" hidden="false" default="" required="false" values="0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0" />
    <element type="PublishDate" UID="5fdba65915744addb710631476822112" label="Publish Date" readonly="true" hidden="true" default="" required="false" />
    <element type="xpowergroupend_" />
    <element type="xpowernavigation_BreadcrumbNavigation" UID="140b1582e50e4a098e190942980bd728" label="Breadcrumb Navigation" readonly="false" hidden="true" default="" required="true" Expanded="false" Navigation="Ancestors" GenerationOrder="down" StartPage="x5" MaxNodes="" MaxDepth="" Query="">
      <element type="Exports" default="" />
    </element>
    <element type="xpowercomponent_SectionControl" UID="56564fa9c2bd4e9ba44a417960146376" label="SectionControl" readonly="false" hidden="true" default="" required="true" Component="" CompTypes="SectionControl" AutoEmbed="" WrappedUp="" AllowWrappingChange="" />
  </ElementType>
</Schema>

Ответы [ 3 ]

0 голосов
/ 29 сентября 2019

Очень легко сделать в XSLT.Вам не нужна схема.Если нет специальных символов, которые нужно экранировать и т. Д., Это так просто:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0" expand-text="yes">
<xsl:mode on-no-match="shallow-skip"/>
<xsl:output method="text"/>  
<xsl:template match="Element"
>{@type},{@label},{@CompTypes},{@readonly},{@hidden},{@required}
</xsl:template>
</xsl:transform>

Это решение XSLT 3.0;Если вы предпочитаете использовать процессор XSLT 1.0, поставляемый в комплекте с .NET, он будет немного более подробным, но все же довольно простым.Я не включил строку заголовка, но добавить ее просто.

В XSLT 3.0 вы даже можете добавить автоматизацию, чтобы применить ее ко всей коллекции файлов XML (в версии 1.0 вам нужно было бы сделать это).что в вызывающем скрипте).

0 голосов
/ 29 сентября 2019

В C # используйте System.Xml.XmlDocument и синтаксис XPath в SelectNodes

XmlDocument xml = new XmlDocument();
xml.Load( strFile );
foreach (XmlElement ndRow in xml.SelectNodes("//element")) {
    string strType = ndRow.GetAttribute("type");
    string strLabel = ndRow.GetAttribute("label");
}
0 голосов
/ 29 сентября 2019

Используйте этот код.Вам необходимо конвертировать xmldocument в xdocument.Таким образом, вы можете легко захватить каждый элемент и его данные.Я использовал тот же файл, который вы предоставили.Я также упомянул пример того, как читать элементы в цикле и его дочерние элементы.

    class Program
{
    static void Main(string[] args)
    {
        Parse();
    }

    public static void Parse()
    {

        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load(@"D:\New Text Document.xsd");

        var captureElements = new List<CustomElements>();


        var xdocument = xmlDoc.ToXDocument();
        foreach (var element in xdocument.Elements())
        {
            foreach (var node in element.Elements()) //childs...
            {

                if (node.Name.LocalName.Equals("ElementType"))
                {
                    foreach (var scopeNode in node.Elements())
                    {
                        if (scopeNode.Name.LocalName.Equals("element"))
                        {
                            var xml = XElement.Parse(scopeNode.ToString());
                            var customElement = new CustomElements();

                            customElement.Type = xml.Attribute("type")?.Value;
                            customElement.Label = xml.Attribute("label")?.Value;
                            customElement.CompTypes = xml.Attribute("CompTypes")?.Value;
                            customElement.Readonly = xml.Attribute("readonly")?.Value;
                            customElement.Hidden = xml.Attribute("hidden")?.Value;
                            customElement.Require = xml.Attribute("require")?.Value;

                            captureElements.Add(customElement);
                        }

                    }
                }
            }
        }
    }
}
public static class DocumentExtensions
{
    public static XmlDocument ToXmlDocument(this XDocument xDocument)
    {
        var xmlDocument = new XmlDocument();
        using (var xmlReader = xDocument.CreateReader())
        {
            xmlDocument.Load(xmlReader);
        }
        return xmlDocument;
    }

    public static XDocument ToXDocument(this XmlDocument xmlDocument)
    {
        using (var nodeReader = new XmlNodeReader(xmlDocument))
        {
            nodeReader.MoveToContent();
            return XDocument.Load(nodeReader);
        }
    }
}
public class CustomElements
{
    public string Type { get; set; }
    public string Label { get; set; }
    public string CompTypes { get; set; }
    public string Readonly { get; set; }
    public string Hidden { get; set; }
    public string Require { get; set; }
}
...