Browse Source

Able to get data from XML

Piotr Czajkowski 3 years ago
parent
commit
c21d71f7fa
3 changed files with 53 additions and 0 deletions
  1. 44 0
      PSDText/PSDText.cs
  2. 8 0
      PSDText/TextData.cs
  3. 1 0
      PSDTextTests/PSDTextTests.cs

+ 44 - 0
PSDText/PSDText.cs

@@ -1,12 +1,16 @@
 using System;
+using System.Collections.Generic;
 using System.IO;
 using System.Text;
+using System.Xml;
 
 namespace PSDText
 {
     public class PSDText
     {
         private readonly string _xmlData;
+        private readonly XmlNamespaceManager _ns = new XmlNamespaceManager(new NameTable());
+        public List<TextData> TextData;
         private string Readxmpmeta(string path)
         {
             var sb = new StringBuilder(1000);
@@ -35,12 +39,52 @@ namespace PSDText
             return sb.ToString();
         }
 
+        private void AddXMLNamespaces()
+        {
+            _ns.AddNamespace("x", "adobe:ns:meta/");
+            _ns.AddNamespace("rdf", "http://www.w3.org/1999/02/22-rdf-syntax-ns#");
+            _ns.AddNamespace("photoshop", "http://ns.adobe.com/photoshop/1.0/");
+        }
+
+        private XmlDocument ReadXML()
+        {
+            var xml = new XmlDocument();
+            
+            using (var sr = new StringReader(_xmlData))
+            using (var reader = XmlReader.Create(sr))
+            {
+                xml.Load(reader);
+            }
+
+            return xml;
+        }
+
+        public List<TextData> GetTextData()
+        {
+            var xml = ReadXML();
+            var data = new List<TextData>();
+            
+            var textNodes =
+                xml.SelectNodes("/x:xmpmeta/rdf:RDF/rdf:Description/photoshop:TextLayers/rdf:Bag/rdf:li", _ns);
+            foreach (XmlNode textNode in textNodes)
+            {
+                var name = textNode.SelectSingleNode("./photoshop:LayerName", _ns)?.InnerText;
+                var text = textNode.SelectSingleNode("./photoshop:LayerText", _ns)?.InnerText;
+
+                data.Add(new TextData{Name = name, Text = text});
+            }
+
+            return data;
+        }
+
         public PSDText(string path)
         {
             if (!File.Exists(path))
                 throw new Exception($"File {path} doesn't exist!");
 
             _xmlData = Readxmpmeta(path);
+            AddXMLNamespaces();
+            TextData = GetTextData();
         }
     }
 }

+ 8 - 0
PSDText/TextData.cs

@@ -0,0 +1,8 @@
+namespace PSDText
+{
+    public class TextData
+    {
+        public string Name;
+        public string Text;
+    }
+}

+ 1 - 0
PSDTextTests/PSDTextTests.cs

@@ -10,6 +10,7 @@ namespace PSDTextTests
         public void ReadXMLFromPSD()
         {
             var test = new PSDText.PSDText(TestFile);
+            Assert.NotEmpty(test.TextData);
         }
     }
 }