202 lines
6.7 KiB
C#
202 lines
6.7 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Configuration;
|
|
using System.Data;
|
|
using System.Diagnostics;
|
|
using System.Drawing;
|
|
using System.Linq;
|
|
using System.Security.Cryptography;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using System.Windows.Forms;
|
|
using System.Xml;
|
|
using System.Xml.Linq;
|
|
using System.Xml.XPath;
|
|
using System.IO;
|
|
|
|
namespace WindowsFormsApp1
|
|
{
|
|
public partial class StartShell : Form
|
|
{
|
|
XmlDocument xpathTo = null;
|
|
|
|
public const string SearchFilter =
|
|
"xml files (*.xml)|*.xml|config files (*.config, xml)|*.config|All files (*.*)|*.*";
|
|
private string[] Levels = new string[100];
|
|
public StartShell()
|
|
{
|
|
InitializeComponent();
|
|
}
|
|
|
|
private void BtnFromXml_Click(object sender, EventArgs e)
|
|
{
|
|
openFileDialog1.Title = "Fetch XML-file keeping new values";
|
|
openFileDialog1.Filter = SearchFilter;
|
|
if (openFileDialog1.ShowDialog() == DialogResult.OK)
|
|
{
|
|
lblFromXml.Text = openFileDialog1.FileName;
|
|
}
|
|
}
|
|
|
|
private void BtnToXml_Click(object sender, EventArgs e)
|
|
{
|
|
openFileDialog1.Title = "Fetch XML-file to be updated";
|
|
openFileDialog1.Filter = SearchFilter;
|
|
if (openFileDialog1.ShowDialog() == DialogResult.OK)
|
|
{
|
|
lblToXml.Text = openFileDialog1.FileName;
|
|
}
|
|
}
|
|
|
|
private void BtnStart_Click(object sender, EventArgs e)
|
|
{
|
|
// XML-document analysed
|
|
|
|
XmlDocument xnode = new XmlDocument();
|
|
xnode.Load(lblFromXml.Text);
|
|
|
|
|
|
if (lblToXml.Text != "toxmlpath")
|
|
{
|
|
// XML-document for receiving file
|
|
|
|
xpathTo = new XmlDocument();
|
|
xpathTo.Load(lblToXml.Text);
|
|
}
|
|
|
|
|
|
lvwResult.Items.Clear();
|
|
Process(xnode);
|
|
|
|
// Saves to temporary file
|
|
xpathTo.Save("abc.xml");
|
|
|
|
// Move temporary file to original directory
|
|
|
|
FileInfo fi = new FileInfo(lblToXml.Text);
|
|
var actDir = fi.DirectoryName;
|
|
var createdFile = File.ReadAllBytes("abc.xml");
|
|
var fName = actDir + "\\default_" + DateTime.Now.ToShortDateString()+"__" + DateTime.Now.ToLongTimeString().Replace(":","-") + ".config";
|
|
File.WriteAllBytes(fName,createdFile);
|
|
File.Delete("abc.xml");
|
|
}
|
|
|
|
void Process(XmlNode node)
|
|
{
|
|
// Processing is a recurring process
|
|
Process(node, 0);
|
|
}
|
|
|
|
void Process(XmlNode node, int level)
|
|
{
|
|
|
|
if (node.NodeType == XmlNodeType.Text)
|
|
{
|
|
ListViewItem lviResult = new ListViewItem();
|
|
lviResult.Text = node.ParentNode.LocalName;
|
|
lviResult.SubItems.Add(node.Value);
|
|
|
|
// Find XPath for current node
|
|
var xPath = GetXPathToNode(node);
|
|
|
|
// Routine for XPath creates bad end on text-nodes / chenges to something seems working
|
|
if (xPath.Trim().Substring(xPath.Trim().Length - 9) == "/#text[1]")
|
|
{
|
|
xPath = xPath.Substring(0, xPath.Trim().Length - 9);
|
|
xPath = xPath + "/text()";
|
|
}
|
|
|
|
// Put data into ListView
|
|
|
|
lviResult.SubItems.Add(xPath);
|
|
if (lblToXml.Text != "toxmlpath")
|
|
{
|
|
XmlNode searchedField = xpathTo.SelectSingleNode(xPath);
|
|
if (searchedField != null)
|
|
{
|
|
lviResult.SubItems.Add(searchedField.InnerText);
|
|
searchedField.Value = node.Value;
|
|
}
|
|
else
|
|
{
|
|
searchedField = xpathTo.SelectSingleNode(xPath.Substring(0, xPath.Trim().Length-7));
|
|
if (searchedField.OuterXml != "")
|
|
{
|
|
lviResult.SubItems.Add(searchedField.OuterXml);
|
|
XmlElement elemSearchfield = (XmlElement) searchedField;
|
|
if (elemSearchfield.IsEmpty)
|
|
{
|
|
elemSearchfield.InnerXml = node.Value;
|
|
}
|
|
}
|
|
else lviResult.SubItems.Add("saknas!");
|
|
}
|
|
}
|
|
|
|
|
|
|
|
lvwResult.Items.Add(lviResult);
|
|
}
|
|
|
|
foreach (XmlNode child in node.ChildNodes)
|
|
{
|
|
Process(child, level + 1);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets the X-Path to a given Node
|
|
/// </summary>
|
|
/// <param name="node">The Node to get the X-Path from</param>
|
|
/// <returns>The X-Path of the Node</returns>
|
|
public string GetXPathToNode(XmlNode node)
|
|
{
|
|
if (node.NodeType == XmlNodeType.Attribute)
|
|
{
|
|
// attributes have an OwnerElement, not a ParentNode; also they have
|
|
// to be matched by name, not found by position
|
|
return String.Format("{0}/@{1}", GetXPathToNode(((XmlAttribute)node).OwnerElement), node.Name);
|
|
}
|
|
if (node.ParentNode == null)
|
|
{
|
|
// the only node with no parent is the root node, which has no path
|
|
return "";
|
|
}
|
|
|
|
// Get the Index
|
|
int indexInParent = 1;
|
|
XmlNode siblingNode = node.PreviousSibling;
|
|
// Loop thru all Siblings
|
|
while (siblingNode != null)
|
|
{
|
|
// Increase the Index if the Sibling has the same Name
|
|
if (siblingNode.Name == node.Name)
|
|
{
|
|
indexInParent++;
|
|
}
|
|
siblingNode = siblingNode.PreviousSibling;
|
|
}
|
|
|
|
// the path to a node is the path to its parent, plus "/node()[n]", where n is its position among its siblings.
|
|
return String.Format("{0}/{1}[{2}]", GetXPathToNode(node.ParentNode), node.Name, indexInParent);
|
|
}
|
|
|
|
|
|
private void LvwResult_Click(object sender, EventArgs e)
|
|
{
|
|
var firstSelectedItem = lvwResult.SelectedItems[0];
|
|
var xpath = firstSelectedItem.SubItems[2].Text;
|
|
if (xpath.Trim().Substring(xpath.Trim().Length - 9) == "/#text[1]")
|
|
{
|
|
txtXPathAnalyse.Text = xpath.Substring(0, xpath.Trim().Length - 9);
|
|
}
|
|
else
|
|
{
|
|
txtXPathAnalyse.Text = xpath;
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|