powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Как сравнить два XML документа?
12 сообщений из 12, страница 1 из 1
Как сравнить два XML документа?
    #33460113
Фотография Alex-2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть два 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
Как сравнить два XML документа?
    #33460216
M0us
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
загрузить сравниваемый документ из файла
Код: plaintext
<xsl:variable name="file1" select="document('file1.xml')">

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

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

ЗЫ ЗЫ ЗЫ сам правда не пробовал... так что тоже интересно...
...
Рейтинг: 0 / 0
Как сравнить два XML документа?
    #33460258
Фотография Alex-2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Откуда загружать - не вопрос, например вот так -
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
Как сравнить два XML документа?
    #33460315
M0us
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я и предлагаю сравнение на XSLT-шаблоне написать. просто сейчас времени нет поэтому идею сгенерировал - дальше надо думать...
...
Рейтинг: 0 / 0
Как сравнить два XML документа?
    #33460346
Фотография Alex-2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гениальная мысль ! Ну конечно же в XSLT, а иначе придется ляпать вьюхи к БД :-,
Вот тако е вот ля-ля
Lusy &&
...
Рейтинг: 0 / 0
Как сравнить два XML документа?
    #33460448
M0us
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex-2Вот тако е вот ля-ля

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

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

а в чем проблема вьюхи написать? кстати, в них нельзя FOR XML *** использовать...
...
Рейтинг: 0 / 0
Как сравнить два XML документа?
    #33461611
Фотография Alex-2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дык
Код: 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
Как сравнить два XML документа?
    #33461662
qu-qu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как сравнить два XML документа?
    #33461776
Фотография Alex-2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто нечеловечески здорово!!!! Жаль, что теперь надо шефа уламывать использовать трансформацию. Он
фа
нат Сиквела (Sи Qве L). Что ж ему такое пообещать?...
Lusy &&
...
Рейтинг: 0 / 0
Как сравнить два XML документа?
    #33461927
Фотография Alex-2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как шаблон влепить с помощью трансформации в файл с rowset?....
Lusy &&
...
Рейтинг: 0 / 0
Как сравнить два XML документа?
    #33461958
M0us
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пусть шаблон в файле и валяется.
а в xml на него ссылку можно запихнуть вида:
Код: plaintext
<?xml-stylesheet type="text/xsl" href="шаблон.xsl"?>
...
Рейтинг: 0 / 0
Как сравнить два XML документа?
    #33461963
Фотография Alex-2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть вариант на 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
12 сообщений из 12, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Как сравнить два XML документа?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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