Чтобы упростить ремонтопригодность, проведите четкую грань между уровнями ответственности.
Модель отвечает за бизнес-логику
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 и связать вид непосредственно с моделью. Но наличие «буфера» между представлением и бизнес-логикой облегчит вашу жизнь, когда проект начнет расти.
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);
преобразовать эту строку в 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);
}
После того, как вы сделали простые способы запросить XML в Java. Посмотрите на XOM.
Используя 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 обсуждаются здесь .
@ Комментарии к этому ответу :
Вы можете создать метод, чтобы он выглядел проще
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)));
}
Вот пример того, как это сделать с 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, даже если вы захотите ;-) (например, с недопустимыми символами в символьных данных)