Как я извлекаю дочерний элемент от XML до строки в Java?

Битовые операторы приведут к 32-битному номеру со знаком , означающему, что если бит в позиции 31 (считая от младшего значащего бита справа, который является битом 0) равен 1, число будет отрицательным.

Чтобы этого не происходило, используйте операторы, отличные от << или |, которые приводят к получению 32-разрядного числа со знаком. Например:

(bit * 2**e) + make (more, e + 4)

Форсирование без знака 32-битный

Операторы сдвига битов предназначены для принудительного перевода результата в 32-битный диапазон со знаком, по крайней мере, это заявлено в MDN (на момент написания):

Операнды всех побитовых операторов преобразуются в 32-разрядные целые числа со знаком

blockquote>

На самом деле это не совсем так. Оператор >>> является исключением из этого. EcmaScript 2015, раздел 12.5.8.1. утверждает, что операнды отображаются в беззнаковых 32-битных перед сдвигом в 0 битов. Таким образом, даже если бы вы сместили ноль битов, вы бы увидели этот эффект.

Вам нужно будет применить его только один раз к конечному значению, как, например, в вашей функции print:

console.log((n>>>0).toString(2))

Решение BigInt

Если вам нужно даже больше 32 биты, и ваш движок JavaScript поддерживает BigInt , как , который некоторые уже делают, затем используйте BigInts для операндов, участвующих в побитовых операторах - тогда они не будут использовать Перенос 32-разрядных чисел со знаком (обратите внимание на суффиксы n):

const make = ([ bit, ...more ], e = 0n) =>
  bit === undefined
    ? 0n
    : (bit << e) + make (more, e + 4n)

const print = n =>
  console.log(n.toString(2))

// Test
for (let i=1; i<20; i++) {
    print(make(Array(i).fill(15n))) // longer and longer array...
}

Примечание: если вы получаете сообщение об ошибке выше, попробуйте еще раз с Chrome ...

7
задан phil swenson 10 March 2009 в 20:05
поделиться

4 ответа

Вы правы со стандартным XML API, нет хорошего пути - вот один пример (может быть ошибка, на которой поехали; это работает, но я записал это давным-давно).

import javax.xml.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;
import org.w3c.dom.*;
import java.io.*;

public class Proc
{
    public static void main(String[] args) throws Exception
    {
        //Parse the input document
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document doc = builder.parse(new File("in.xml"));

        //Set up the transformer to write the output string
        TransformerFactory tFactory = TransformerFactory.newInstance();
        Transformer transformer = tFactory.newTransformer();
        transformer.setOutputProperty("indent", "yes");
        StringWriter sw = new StringWriter();
        StreamResult result = new StreamResult(sw);

        //Find the first child node - this could be done with xpath as well
        NodeList nl = doc.getDocumentElement().getChildNodes();
        DOMSource source = null;
        for(int x = 0;x < nl.getLength();x++)
        {
            Node e = nl.item(x);
            if(e instanceof Element)
            {
                source = new DOMSource(e);
                break;
            }
        }

        //Do the transformation and output
        transformer.transform(source, result);
        System.out.println(sw.toString());
    }
}

Казалось бы, что Вы могли получить первого ребенка только при помощи doc.getDocumentElement () .getFirstChild (), но проблема с этим состоит в том, если существует какой-либо пробел между корнем и дочерним элементом, который создаст текстовый узел в дереве, и Вы получите тот узел вместо фактического узла элемента. Вывод из этой программы:

D:\home\tmp\xml>java Proc
<?xml version="1.0" encoding="UTF-8"?>
<element1>
        <child attr1="blah">
           <child2>blahblah</child2>
       </child>
   </element1>

Я думаю, что можно подавить xml строку версии, если Вам не нужна она, но я не уверен в этом. Я, вероятно, попытался бы пользоваться сторонней библиотекой XML если вообще возможный.

7
ответ дан 6 December 2019 в 11:53
поделиться

XMLBeans является простым в использовании (после того как Вы приобретаете навык его), инструмент для контакта с XML, не имея необходимость иметь дело с раздражениями из-за парсинга.

Это требует, чтобы у Вас была схема для XML-файла, но это также обеспечивает инструмент для генерации схемы от exisint XML-файла (в зависимости от потребностей, сгенерированный на прекрасен, вероятно).

1
ответ дан 6 December 2019 в 11:53
поделиться

Я рекомендовал бы JDOM. Это - библиотека Java XML, которая делает контакт с XML намного легче, чем стандартный подход W3C.

3
ответ дан 6 December 2019 в 11:53
поделиться

Если Ваш xml имеет схему, поддерживающую его, Вы могли бы использовать xmlbeans, или JAXB для генерации pojo возражает, что помогают Вам упорядочить/не упорядочить xml.

http://xmlbeans.apache.org/ https://jaxb.dev.java.net/

0
ответ дан 6 December 2019 в 11:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: