Самый простой способ запросить XML в Java

Чтобы упростить ремонтопригодность, проведите четкую грань между уровнями ответственности.

Модель отвечает за бизнес-логику

class Model
{    
    public int X { get; set; }
    public int Y { get; set; }

    public Model() {}

    public int GetRes() => X + Y
}

ViewModel отвечает за подготовку данных для отображения в представлении (если требуется) и за запуск операции бизнес-логики модели, запрошенной из представления.
INotifyPropertyChanged уведомит представление о возможных изменениях без зависимости модели представления от конкретного типа представления.

class ViewModel : INotifyPropertyChanged
{    
    private readonly Model _model;

    public int X { get; set; }

    public int Y { get; set; }

    private string _result = "";
    public string Result 
    { 
        get
        {
            return _result;
        } 

        private set
        {
            if (_result.Equals(value) == false)
            {
                _result = value;
                RaisePropertyChanged();
            }

        }
    }

    public ViewModel(Model model) => _model = model;

    public void CalculateResult()
    {
         Result = _model.GetRes().ToString();
    }

    // Implementation of INotifyPropertyChanged
    public event PropertyChangedEventHandler PropertyChanged;

    private void RaisePropertyChanged([CallerMemberName] string propertyName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

Представление, ответственность за которое заключается в отображении значений из viewmodel или при вызове операции viewmodel, когда пользователь запрашивает.

public partial class View : Form
{    
    private ViewModel _viewmodel;

    public View()
    {
        InitializeComponent();   
        var model = new Model { X = 10, Y = 20 }  
        _viewmodel = new ViewModel(model);

        // Bind controls to the viewmodel
        textboxForX.DataBindings.Add("Text", _viewmodel, "X", true);
        textboxForY.DataBindings.Add("Text", _viewmodel, "Y", true);
        labelForResult.DataBindings.Add("Text", _viewmodel, "Result", true);            
    } 

    private void CalculateButton_Click(object sender, EvetnArgs e)
    {
        _viewmodel.Calculate();
    }
}    

Обратите внимание, что в простых случаях (как выше) вы можете пропустить «слой» viewmodel и связать вид непосредственно с моделью. Но наличие «буфера» между представлением и бизнес-логикой облегчит вашу жизнь, когда проект начнет расти.

19
задан 30 April 2009 в 15:11
поделиться

7 ответов

XPath с использованием Java 1.5 и выше, без внешних зависимостей:

String xml = "<resp><status>good</status><msg>hi</msg></resp>";

XPathFactory xpathFactory = XPathFactory.newInstance();
XPath xpath = xpathFactory.newXPath();

InputSource source = new InputSource(new StringReader(xml));
String status = xpath.evaluate("/resp/status", source);

System.out.println("satus=" + status);
36
ответ дан 30 November 2019 в 02:22
поделиться

Вы можете попробовать JXPath

2
ответ дан 30 November 2019 в 02:22
поделиться

преобразовать эту строку в DOM-объект и посетить узлы:

Document dom= DocumentBuilderFactory().newDocumentBuilder().parse(new InputSource(new StringReader(myxml)));
Element root= dom.getDocumentElement();
for(Node n=root.getFirstChild();n!=null;n=n.getNextSibling())
 {
 System.err.prinlnt("Current node is:"+n);
 }
1
ответ дан 30 November 2019 в 02:22
поделиться

После того, как вы сделали простые способы запросить XML в Java. Посмотрите на XOM.

2
ответ дан 30 November 2019 в 02:22
поделиться

Используя dom4j аналогично решению Макдауэлла :

String myxml = "<resp><status>good</status><msg>hi</msg></resp>";

Document document = new SAXReader().read(new StringReader(myxml));
String status = document.valueOf("/resp/msg");

System.out.println("status = " + status);

Обработка XML немного проще с использованием dom4j. Есть и несколько других сопоставимых XML-библиотек . Альтернативы dom4j обсуждаются здесь .

7
ответ дан 30 November 2019 в 02:22
поделиться

@ Комментарии к этому ответу :

Вы можете создать метод, чтобы он выглядел проще

String xml = "<resp><status>good</status><msg>hi</msg></resp>";

System.out.printf("satus= %s\n", getValue("/resp/status", xml ) );

Реализация:

public String getValue( String path, String xml ) { 
    return XPathFactory
               .newInstance()
               .newXPath()
               .evaluate( path , new InputSource(
                                 new StringReader(xml)));

}
2
ответ дан 30 November 2019 в 02:22
поделиться

Вот пример того, как это сделать с XOM :

String myxml = "<resp><status>good</status><msg>hi</msg></resp>";

Document document = new Builder().build(myxml, "test.xml");
Nodes nodes = document.query("/resp/status");

System.out.println(nodes.get(0).getValue());

Мне нравится XOM больше, чем dom4j за его простоту и правильность . XOM не позволит вам создать недопустимый XML, даже если вы захотите ;-) (например, с недопустимыми символами в символьных данных)

6
ответ дан 30 November 2019 в 02:22
поделиться
Другие вопросы по тегам:

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