Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Как сравнить два XML документа? / 12 сообщений из 12, страница 1 из 1
27.12.2005, 16:58
    #33460113
Alex-2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сравнить два XML документа?
Есть два XML документа - один содержит ряд, другой - набор подобных рядов
1 ......
<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<row>
<ses>212</ses>
<usr>2</usr>
<ip1>192.168.0.11</ip1>
<ip2>192.168.0.11</ip2>
</row>
2 ......
<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<rowset><row></row>....<row></row></rowset>
Теоретически содержимое первого должно иметься во втором.

Как это проверить ????

- не прибегая к сравнению по вхождению одной строки в другую (шеф не разрешает, говорит это слишком топорно), но и не используя сложных преобразований!

Lusy &&
...
Рейтинг: 0 / 0
27.12.2005, 17:36
    #33460216
M0us
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сравнить два XML документа?
загрузить сравниваемый документ из файла
Код: plaintext
<xsl:variable name="file1" select="document('file1.xml')">

в другую переменную загружается кусок 2-го xml и они сравниваются...

ЗЫ только из $file1 нужно убрать лишнее перед сравнением...

ЗЫ ЗЫ ЗЫ сам правда не пробовал... так что тоже интересно...
...
Рейтинг: 0 / 0
27.12.2005, 17:47
    #33460258
Alex-2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сравнить два XML документа?
Откуда загружать - не вопрос, например вот так -
Document doc = factory.newDocumentBuilder().parse(new InputSource(new StringReader(xml)));
- где xml - текстовая строка
и получить из DOM текстовую строку - не вопрос с помощью стандартного преобразования

try {
// Create a transformer
Transformer xformer = TransformerFactory.newInstance().newTransformer();

// Set the public and system id
xformer.setOutputProperty(OutputKeys.METHOD, "xml");

// Write the DOM document to a file
Source source = new DOMSource(dd);
StringWriter sw = new StringWriter();
Result result = new StreamResult(sw);
xformer.transform(source, result);
st=sw.toString();
} catch (TransformerConfigurationException e) {
} catch (TransformerException e) { }

получаем в st - строку типа
<?xml version=\"1.0\" encoding=\"UTF-8\"?><rowset><row></row>....<row></row></rowset>

Не проблема - но шеф !!! ети его так не разрешает просто сравнивать две строки

"Выковыривай" - говорит из первого и сравнивай со вторым, а я так думаю - должен быть простой способ получить ответ о наличии ряда в сете!!! без кавыряния
Только вот я его пока не знаю - может кто подскажет.....
Lusy &&
...
Рейтинг: 0 / 0
27.12.2005, 18:01
    #33460315
M0us
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сравнить два XML документа?
я и предлагаю сравнение на XSLT-шаблоне написать. просто сейчас времени нет поэтому идею сгенерировал - дальше надо думать...
...
Рейтинг: 0 / 0
27.12.2005, 18:17
    #33460346
Alex-2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сравнить два XML документа?
Гениальная мысль ! Ну конечно же в XSLT, а иначе придется ляпать вьюхи к БД :-,
Вот тако е вот ля-ля
Lusy &&
...
Рейтинг: 0 / 0
27.12.2005, 19:11
    #33460448
M0us
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сравнить два XML документа?
Alex-2Вот тако е вот ля-ля

предлагаю без "ля-ля" Вам описать свою задачу. М.б. легче на предыдущих этапах что-то поправить!? Сложно рассуждать не видя всего процесса.

действительно получается "ля-ля"...

а в чем проблема вьюхи написать? кстати, в них нельзя FOR XML *** использовать...
...
Рейтинг: 0 / 0
28.12.2005, 12:31
    #33461611
Alex-2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сравнить два XML документа?
Дык
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
public class QueryManager {
  static ResourceBundle res = ResourceBundle.getBundle("DBProperties");
  Database database1 = new Database();
  QueryDataSet qDS1 = new QueryDataSet();
  String query = "SELECT A.ses, A.usr, A.iph, A.ipa FROM sess as A";
  static String where;

  boolean prepareQuery() {
    try {
      database1.setConnection(new com.borland.dx.sql.dataset.
                              ConnectionDescriptor(res.getString("connect"),
          res.getString("user"), res.getString("password"), false,
          res.getString("driver")));
    }
    catch (Exception e) {
      e.printStackTrace();
      return false;
    }
    return true;
  }

  String executeQuery(String xmlUserPropertyes) {
    if (prepareQuery()) {
      try {
        Document doc = parseXml(xmlUserPropertyes, false);
        visit(doc,  0 , false);
        qDS1.setQuery(new com.borland.dx.sql.dataset.QueryDescriptor(database1,
            query + where, null, true, Load.ALL));
        database1.openConnection();
        qDS1.open();
        qDS1.executeQuery();
       // Проверка лигитимности сессии ********************
        if(qDS1.rowCount()>  0 ) System.out.println("Сессия лигитимна");
                       else System.out.println("Сессия не лигитимна");
      //**********************************************
        qDS1.close();
        database1.closeConnection();
      }
      catch (Exception e) {
        e.printStackTrace();
      }
    }
    return "Yes";
  }

  public static Document parseXml(String xml, boolean validating) {
    try {
      // Create a builder factory
      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
      factory.setValidating(validating);

      // Create the builder and parse the file
      Document doc = factory.newDocumentBuilder().parse(new InputSource(new
          StringReader(xml)));
      return doc;
    }
    catch (SAXException e) {
      // A parsing error occurred; the xml input is not valid
    }
    catch (ParserConfigurationException e) {
    }
    catch (IOException e) {
    }
    return null;
  }

  // This method visits all the nodes in a DOM tree
  public static void visit(Node node, int level, boolean ses) {
    // Process node

    // If there are any children, visit each one
    NodeList list = node.getChildNodes();

    for (int i =  0 ; i < list.getLength(); i++) {
      // Get child node
      Node childNode = list.item(i);
      if (list.item(i).getNodeName().equals("ses")) {
        visit(childNode, level +  1 , true);
      }
      if (ses) {
        if (list.item(i).getNodeName().equals("#text")) {
          where = " WHERE A.ses = '" + list.item(i).toString() + "' ";
          visit(childNode, level +  1 , false);
        }

      }
      // Visit child node
      visit(childNode, level +  1 , false);

    }
  }
}
Уже написал! Через вьюху и запрос... А так хотелось сравнить два XML http://www.sql.ru/forum/images/smoke.gif

Lusy &&
...
Рейтинг: 0 / 0
28.12.2005, 12:43
    #33461662
qu-qu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сравнить два XML документа?
Alex-2... А так хотелось сравнить два XML ...

Дык, в чем проблема-то?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
<?xml version="1.0" encoding="UTF-8"?>
<!-- test.xml -->
<root>
  <pattern>
    <row>
      <ses> 212 </ses>
      <usr> 2 </usr>
      <ip1> 192 . 168 . 0 . 11 </ip1>
      <ip2> 192 . 168 . 0 . 11 </ip2>
    </row>
  </pattern>
  <rowset>
    <row>
      <ses> 212 </ses>
      <usr> 2 </usr>
      <ip1> 192 . 168 . 0 . 11 </ip1>
      <ip2> 192 . 168 . 0 . 11 </ip2>
    </row>
    <row>
      <ses> 213 </ses>
      <usr> 3 </usr>
      <ip1> 192 . 168 . 0 . 12 </ip1>
      <ip2> 192 . 168 . 0 . 14 </ip2>
    </row>
    <row>
      <ses> 212 </ses>
      <usr> 2 </usr>
      <ip1> 192 . 168 . 0 . 11 </ip1>
      <ip2> 192 . 168 . 0 . 11 </ip2>
    </row>
    <row>
      <ses> 213 </ses>
      <usr> 3 </usr>
      <ip1> 192 . 168 . 0 . 12 </ip1>
      <ip2> 192 . 168 . 0 . 14 </ip2>
    </row>
    <row>
      <ses> 212 </ses>
      <usr> 2 </usr>
      <ip1> 192 . 168 . 0 . 11 </ip1>
      <ip2> 192 . 168 . 0 . 11 </ip2>
    </row>
  </rowset>
</root>
Можете элемент pattern смело выносить в отдельный документ (я его в тексте основного документа ввел только для простоты и наглядности примера).
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
<?xml version="1.0" encoding="UTF-8"?>
<!-- test.xsl -->
<xsl:stylesheet version="1.0"
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output encoding="UTF-8" method="text"/>

<xsl:template match="/">
 <xsl:variable name="pat" select="//pattern/row"/>
<!-- ^^^^^ здесь можно заменить на что-то типа select="document(pattern.xml)" -->
 <xsl:value-of select="count(//rowset/row[ses = $pat/ses and usr = $pat/usr and ip1 = $pat/ip1 and ip2 = $pat/ip2])"/>
</xsl:template>

</xsl:stylesheet>
...
Рейтинг: 0 / 0
28.12.2005, 13:09
    #33461776
Alex-2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сравнить два XML документа?
Просто нечеловечески здорово!!!! Жаль, что теперь надо шефа уламывать использовать трансформацию. Он
фа
нат Сиквела (Sи Qве L). Что ж ему такое пообещать?...
Lusy &&
...
Рейтинг: 0 / 0
28.12.2005, 13:55
    #33461927
Alex-2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сравнить два XML документа?
А как шаблон влепить с помощью трансформации в файл с rowset?....
Lusy &&
...
Рейтинг: 0 / 0
28.12.2005, 14:05
    #33461958
M0us
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сравнить два XML документа?
пусть шаблон в файле и валяется.
а в xml на него ссылку можно запихнуть вида:
Код: plaintext
<?xml-stylesheet type="text/xsl" href="шаблон.xsl"?>
...
Рейтинг: 0 / 0
28.12.2005, 14:06
    #33461963
Alex-2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сравнить два XML документа?
Есть вариант на Java через DOM
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
// Это шаблон 
//<pattern>
//    <row>
//      <ses> 212 </ses>
//      <usr> 2 </usr>
//      <ip1> 192 . 168 . 0 . 11 </ip1>
//      <ip2> 192 . 168 . 0 . 11 </ip2>
//    </row>
//  </pattern>
Document doc1 = parseXmlFile("pattern.xml", false);
    NodeList list = doc1.getElementsByTagName("row");
    Element element = (Element)list.item( 0 );
    
    // Create another document
    Document doc2 = parseXmlFile("infilename2.xml", false);
    
    // Make a copy of the element subtree suitable for inserting into doc2
    Node dup = doc2.importNode(element, true);
    
    // Insert the copy into doc2
    doc2.getDocumentElement().appendChild(dup);
Lusy &&
...
Рейтинг: 0 / 0
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Как сравнить два XML документа? / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]