Что лучший способ состоит в том, чтобы проверить XML-файл против файла XSD?

К сожалению, вы можете установить только дополнение:

@Override
public void onMapReady(GoogleMap googleMap) {
   googleMap.setPadding(left, top, right, bottom);
   ...
}

В итоге я создал свой собственный и вложил его в макет фрейма, используя layout_gravity, чтобы указать, где я его хочу, в этом case bottom / end:

<FrameLayout
   android:layout_width="match_parent"
   android:layout_height="300dp">

   <fragment
       android:id="@+id/map"
       android:name="com.google.android.gms.maps.SupportMapFragment"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       .../>


     <ImageView
       android:id="@+id/myLocationCustomButton"
       android:layout_width="@dimen/custom_my_location_button_size"
       android:layout_height="@dimen/custom_my_location_button_size"
       android:layout_gravity="bottom|end"
       android:background="@drawable/disc"
       android:backgroundTint="@android:color/white"
       android:padding="@dimen/margin_smallest"
       android:src="@drawable/ic_my_location"
       ../>
</FrameLayout>

Затем в ходе операции я инициализировал и запустил клиент google api, который я могу использовать для извлечения текущего местоположения при необходимости кнопкой во время клика, см. кнопку click слушатель ниже:

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    ...
    if (googleApiClient == null) {
        googleApiClient = new GoogleApiClient.Builder(this)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API)
                .build();
    }

    myLocationButton = rootView.findViewById(R.id.myLocationCustomButton);
}

@Override
protected void onStart() {
    googleApiClient.connect();
    super.onStart();
}

@Override
protected void onStop() {
    googleApiClient.disconnect();
    super.onStop();
}

@Override
public void onConnected(@Nullable Bundle bundle) {
    myLocationButton.performClick();
}

@Override
public void onConnectionSuspended(int i) {
}

@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
}

@Override
public void onMapReady(final GoogleMap googleMap) {
    this.googleMap = googleMap;

    myLocationButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Location location = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
            CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(new LatLng(location.getLatitude(), location.getLongitude()), 16);
            MainActivity.this.googleMap.animateCamera(cameraUpdate, 250, null);
        }
    });

В моем модуле build.gradle моего подмалога моего приложения также есть:

ext {
    playServicesVersion = "8.4.0"
}

dependencies {
   ...     
   compile "com.google.android.gms:play-services-location:${playServicesVersion}"
   ...
}

Надеюсь, что это поможет.

256
задан ScanQR 27 December 2016 в 00:12
поделиться

7 ответов

Библиотека Среды выполнения Java поддерживает проверку. Прошлый раз, когда я проверил это, был Apache синтаксический анализатор Xerces под покрытиями. Необходимо, вероятно, использовать javax.xml.validation. Блок проверки допустимости .

import javax.xml.XMLConstants;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.*;
import java.net.URL;
import org.xml.sax.SAXException;
//import java.io.File; // if you use File
import java.io.IOException;
...
URL schemaFile = new URL("http://host:port/filename.xsd");
// webapp example xsd: 
// URL schemaFile = new URL("http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd");
// local file example:
// File schemaFile = new File("/location/to/localfile.xsd"); // etc.
Source xmlFile = new StreamSource(new File("web.xml"));
SchemaFactory schemaFactory = SchemaFactory
    .newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
try {
  Schema schema = schemaFactory.newSchema(schemaFile);
  Validator validator = schema.newValidator();
  validator.validate(xmlFile);
  System.out.println(xmlFile.getSystemId() + " is valid");
} catch (SAXException e) {
  System.out.println(xmlFile.getSystemId() + " is NOT valid reason:" + e);
} catch (IOException e) {}

постоянная фабрика схемы является строкой http://www.w3.org/2001/XMLSchema, который определяет XSDs. Вышеупомянутый код проверяет ВОЕННЫЙ дескриптор развертывания против URL http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd, но Вы могли столь же легко проверить против локального файла.

Вы не должны использовать DOMParser для проверки документа (если цель не состоит в том, чтобы создать объектную модель документа так или иначе). Это начнет создавать Объекты DOM, поскольку это анализирует документ - расточительный, если Вы не собираетесь использовать их.

324
ответ дан rogerdpack 23 November 2019 в 02:44
поделиться

Вот то, как сделать это с помощью Xerces2. Учебное руководство для этого, здесь (req. регистрация).

Исходная атрибуция: очевидно скопированный от здесь :

import org.apache.xerces.parsers.DOMParser;
import java.io.File;
import org.w3c.dom.Document;

public class SchemaTest {
  public static void main (String args[]) {
      File docFile = new File("memory.xml");
      try {
        DOMParser parser = new DOMParser();
        parser.setFeature("http://xml.org/sax/features/validation", true);
        parser.setProperty(
             "http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation", 
             "memory.xsd");
        ErrorChecker errors = new ErrorChecker();
        parser.setErrorHandler(errors);
        parser.parse("memory.xml");
     } catch (Exception e) {
        System.out.print("Problem parsing the file.");
     }
  }
}
25
ответ дан M. A. Kishawy 23 November 2019 в 02:44
поделиться

При генерации XML-файлов программно можно хотеть посмотреть библиотека XMLBeans . Используя инструмент командной строки, XMLBeans автоматически генерирует и пакет ряд объектов Java на основе XSD. Можно затем использовать эти объекты создать XML-документ на основе этой схемы.

Это имеет встроенную поддержку проверки схемы и может преобразовать объекты Java в XML-документ и наоборот.

Castor и JAXB является другими библиотеками Java, которые служат подобной цели к XMLBeans.

2
ответ дан Todd 23 November 2019 в 02:44
поделиться

Вы ищете инструмент или библиотеку?

До библиотек идет, в значительной степени фактический стандарт Xerces2, который имеет и C++ и Java версии.

Быть носом предупредил, хотя, это - тяжелое решение для веса. Но с другой стороны, проверка XML против файлов XSD является довольно тяжелой проблемой веса.

Что касается инструмента, чтобы сделать это для Вас, XMLFox, кажется, достойное бесплатное решение, но не использовавший его лично я не могу сказать наверняка.

0
ответ дан Adam 23 November 2019 в 02:44
поделиться

Я должен был проверить XML против XSD всего одно время, таким образом, я попробовал XMLFox. Я нашел, что он очень сбивал с толку и был странным. Инструкции по справке, казалось, не соответствовали интерфейсу.

я закончил тем, что использовал LiquidXML Studio 2008 (v6), который было намного легче использовать, и более сразу знакомый (UI очень похож на Экспресс Visual Basic 2008 года, который я часто использую). Недостаток: возможность проверки не находится в бесплатной версии, таким образом, я должен был использовать 30-дневную пробную версию.

-3
ответ дан KnomDeGuerre 23 November 2019 в 02:44
поделиться

Еще один ответ: так как Вы сказали, что необходимо проверить файлы, которые Вы генерируете (запись), Вы могли бы хотеть проверить содержание, в то время как Вы пишете, вместо первой записи, затем читая назад для проверки. Можно, вероятно, сделать это с JDK API для проверки Xml при использовании основанного на SAX устройства записи: если так, просто свяжитесь в блоке проверки допустимости путем вызова 'Validator.validate (источник, результат)', куда источник прибывает от писателя, и результат состоит в том где произведенные потребности пойти.

Кроме того, при использовании Stax для записи содержания (или библиотека, которая использует или может использовать stax), Woodstox может также непосредственно поддерживать проверку при использовании XMLStreamWriter. Вот запись в блоге, показывающая, как это сделано:

3
ответ дан Jens Møller 23 November 2019 в 02:44
поделиться

Используя Woodstox, настройте синтаксический анализатор StAX, чтобы проверить против Вашей схемы и проанализировать XML.

, Если исключения пойманы, XML не допустим, иначе это допустимо:

// create the XSD schema from your schema file
XMLValidationSchemaFactory schemaFactory = XMLValidationSchemaFactory.newInstance(XMLValidationSchema.SCHEMA_ID_W3C_SCHEMA);
XMLValidationSchema validationSchema = schemaFactory.createSchema(schemaInputStream);

// create the XML reader for your XML file
WstxInputFactory inputFactory = new WstxInputFactory();
XMLStreamReader2 xmlReader = (XMLStreamReader2) inputFactory.createXMLStreamReader(xmlInputStream);

try {
    // configure the reader to validate against the schema
    xmlReader.validateAgainst(validationSchema);

    // parse the XML
    while (xmlReader.hasNext()) {
        xmlReader.next();
    }

    // no exceptions, the XML is valid

} catch (XMLStreamException e) {

    // exceptions, the XML is not valid

} finally {
    xmlReader.close();
}

Примечание : Если необходимо проверить несколько файлов, необходимо попытаться снова использовать Ваш XMLInputFactory и XMLValidationSchema для максимизации производительности.

0
ответ дан 23 November 2019 в 02:44
поделиться
Другие вопросы по тегам:

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