/// <summary> /// Metoda wyliczająca maksymalną ilość punktów jaką można zdobyć przy porównaniu z danym węzłem /// </summary> /// <param name="element">obiekt WezelXML</param> public static int MaxPunktow(WezelXML element) { int punkty = 0; //atrybuty - 20 za każdy punkty+=element.Element.Attributes().Count()*20; //dzieci - 50 za każde punkty += element.Element.Elements().Count() * 50; // wartosc elementu if (Compare.WartoscElementu(element.Element)!="") { punkty += 150; } // nazwa elementu if (Diff.IgnorujNazwy == true) { punkty += 150; } // przestrzen nazw if (Diff.SprawdzacPrzestrzen==true) { punkty += 100; } return punkty; }
/// <summary> /// Metoda wydobywająca z obiektu WezelXML informacje o jego lokalizacji /// </summary> /// <param name="wezel">obiekt WezelXML</param> public static PositionInfo Pozycja(WezelXML wezel) { if (wezel.Element is IXmlLineInfo) { IXmlLineInfo info = wezel.Element as IXmlLineInfo; PositionInfo pozycja = new PositionInfo(info.LineNumber, info.LinePosition); return pozycja; } return null; }
public void Informacje() { XElement element = new XElement("Root", new XElement("el1", "Some text"), new XElement("el2", "Some text") ); WezelXML wezel = new WezelXML(element); Assert.IsFalse(wezel.Odnaleziony); Assert.IsTrue(wezel.Istotny); Assert.AreSame(wezel.Element, element); Assert.AreEqual(wezel.Sciezka, "/Root[1]"); }
public void JestDzieckiem() { XElement element = new XElement("Root", new XElement("el1", "Some text"), new XElement("el2", "Some text") ); WezelXML wezel = new WezelXML((XElement)element.LastNode); Assert.IsTrue(wezel.JestDzieckiem("/Root[1]")); Assert.IsFalse(wezel.JestDzieckiem("/Root[2]")); wezel = new WezelXML(element); Assert.IsFalse(wezel.JestDzieckiem("/Root[1]")); }
public void ZmianaRodzica() { XElement element = new XElement("Root", new XElement("el1", "Some text"), new XElement("el2", "Some text") ); WezelXML wezel = new WezelXML((XElement)element.LastNode); wezel.ZmianaRodzica("/Root[1]", "/Root[2]"); Assert.AreEqual(wezel.Sciezka, "/Root[2]/el2[1]"); wezel.ZmianaRodzica("/Root[1]", "/Root[2]"); Assert.AreEqual(wezel.Sciezka, "/Root[2]/el2[1]"); }
/// <summary> /// Metoda zwracająca listę podobnych elementów /// </summary> /// <param name="element">obiekt WezelXML</param> public List<WezelXML> PodobneElementy(WezelXML element) { List<WezelXML> rezultat = elementy.FindAll( delegate(WezelXML wezel) { if (Diff.IgnorujNazwy == true) { return wezel.Odnaleziony == false; } else { return wezel.Odnaleziony == false && wezel.Element.Name.LocalName == element.Element.Name.LocalName; } } ); return rezultat; }
public void Pozycja() { XElement xmlTree = new XElement("Root", new XElement("Child", 1), new XElement("Child", 2), new XElement("Child1", 5), new XElement("el", new XAttribute("Att1", "Some text"), new XAttribute("Att2", "Some text") ) ); XElement element = (XElement)xmlTree.LastNode; PositionInfo pos = PositionInfo.Pozycja(element.Attribute("Att2")); Assert.AreEqual(pos.LineNumber, 0); Assert.AreEqual(pos.LinePosition, 0); WezelXML wezel = new WezelXML(element); pos = PositionInfo.Pozycja(wezel); Assert.AreEqual(pos.LineNumber, 0); Assert.AreEqual(pos.LinePosition, 0); }
/// <summary> /// Metoda wyszukująca najpodobniejszy węzeł /// </summary> /// <param name="element">obiekt WezelXML</param> /// <param name="podobne">lista obiektów WezelXML</param> private WezelXML ZnajdzBlizniaczy(WezelXML element, List<WezelXML> podobne) { int naj_wynik, aktualny_wynik, naj_element, max_punktow; naj_wynik = aktualny_wynik = naj_element = max_punktow = 0; max_punktow = Compare.MaxPunktow(element); for (int i = 0; i < podobne.Count; i++) { aktualny_wynik = Compare.Porownanie(element.Element, podobne[i].Element); if (aktualny_wynik > naj_wynik) { naj_wynik = aktualny_wynik; naj_element = i; } } //Diff.Podobienstwo if ((naj_wynik * 100) / max_punktow > Diff.Podobienstwo)//podobny element musi zebrać conajmniej 70 % punktów do zdobycia { return podobne[naj_element]; } return null; }
/// <summary> /// Metoda porównująca wartości tekstowe 2 węzłów /// </summary> /// <param name="lewy">źródłowy obiekt WezelXML</param> /// <param name="prawy">docelowy obiekt WezelXML</param> private void PorownajWartosc(WezelXML lewy, WezelXML prawy) { string l_element = Compare.WartoscElementu(lewy.Element); string p_element = Compare.WartoscElementu(prawy.Element); if (l_element != p_element) { string komunikat; if (l_element.ToLower() == p_element.ToLower()) { komunikat = "Węzły " + lewy.Element.Name.LocalName + " posiadają identyczne wartości tesktowe, ale o różnej wielkości liter"; } else { komunikat = "Węzły " + lewy.Element.Name.LocalName + " posiadają różne wartości tesktowe. Odleglość między wartościami wynosi " + Compare.levenshtein(l_element, p_element).ToString(); } roznice.Add(new Roznica(TYP_ROZNICY.ROZNE_WARTOSCI_WEZLA, komunikat, true, PositionInfo.Pozycja(lewy), PositionInfo.Pozycja(prawy))); } }
/// <summary> /// Metoda porównująca przestrzenie nazw 2 węzłów /// </summary> /// <param name="lewy">źródłowy obiekt WezelXML</param> /// <param name="prawy">docelowy obiekt WezelXML</param> private void PorownajPrzestrzen(WezelXML lewy, WezelXML prawy) { XNamespace l_przestrzen = lewy.Element.Name.Namespace; XNamespace p_przestrzen = prawy.Element.Name.Namespace; if (l_przestrzen != p_przestrzen) { string komunikat = "Węzły " + lewy.Element.Name.LocalName + " należą do różnych przestrzeni nazw. Odleglość między przestrzeniami wynosi " + Compare.levenshtein(l_przestrzen.ToString(), p_przestrzen.ToString()).ToString(); roznice.Add(new Roznica(TYP_ROZNICY.ROZNE_PRZESTRZENIE_NAZW, komunikat, true, PositionInfo.Pozycja(lewy), PositionInfo.Pozycja(prawy))); } }
/// <summary> /// Metoda porównująca atrybuty 2 węzłów /// </summary> /// <param name="lewy">źródłowy obiekt WezelXML</param> /// <param name="prawy">docelowy obiekt WezelXML</param> private void PorownajAtrybuty(WezelXML lewy, WezelXML prawy) { bool znaleziono = false; foreach (XAttribute l_atrybut in lewy.Element.Attributes()) { znaleziono = false; foreach (XAttribute p_atrybut in prawy.Element.Attributes()) { if (Compare.NazwaElementu(l_atrybut) == Compare.NazwaElementu(p_atrybut)) { znaleziono = true; if (l_atrybut.Value != p_atrybut.Value) { string komunikat = "Węzły " + lewy.Element.Name.LocalName + " posiadają różne wartości atrybutu " + l_atrybut.Name.LocalName + ". Odleglość między atrybutami wynosi " + Compare.levenshtein(l_atrybut.Value, p_atrybut.Value).ToString(); roznice.Add(new Roznica(TYP_ROZNICY.ROZNE_WARTOSCI_ATRYBUTU, komunikat, true, PositionInfo.Pozycja(l_atrybut), PositionInfo.Pozycja(p_atrybut))); } p_atrybut.Remove(); break; } } if (!znaleziono) { string komunikat = "Nie znaleziono atrybutu "; if (Diff.SprawdzacPrzestrzen == true) { komunikat += l_atrybut.Name.LocalName; if (l_atrybut.Name.Namespace != "") { komunikat += " w przestrzeni nazw " + l_atrybut.Name.Namespace; } } else { komunikat += l_atrybut.Name.LocalName; } roznice.Add(new Roznica(TYP_ROZNICY.BRAKUJACY_ATRYBUT, komunikat, true, PositionInfo.Pozycja(l_atrybut), PositionInfo.Pozycja(prawy))); } } foreach (XAttribute pozostale_atr in prawy.Element.Attributes()) { string komunikat = "Znaleziono zbędny atrybut " + pozostale_atr.Name.LocalName; if (Diff.SprawdzacPrzestrzen == true && pozostale_atr.Name.Namespace != "") { komunikat += " w przestrzeni nazw " + pozostale_atr.Name.Namespace; } roznice.Add(new Roznica(TYP_ROZNICY.ZBEDNY_ATRYBUT, komunikat, true, PositionInfo.Pozycja(lewy), PositionInfo.Pozycja(pozostale_atr))); } }