2015-01-06 6 views
2

У меня есть модель, которая находится в формате XML, как показано ниже, и мне нужно проанализировать XML и проверить, установлен ли флаг XML internal-flag как истинный или нет. В моих других моделях возможно, что флаг internal-flag установлен как false. И иногда также возможно, что этого поля не будет, поэтому по умолчанию он будет ложным из моего кода.Как извлечь одно логическое поле из XML?

<?xml version="1.0"?> 
<ClientMetadata 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.google.com client.xsd" 
xmlns="http://www.google.com"> 
    <client id="200" version="13"> 
     <name>hello world</name> 
     <description>hello hello</description> 
     <organization>TESTER</organization> 
     <author>david</author> 
     <internal-flag>true</internal-flag> 
     <clock> 
      <clock> 
       <for> 
        <init>val(tmp1) = 1</init> 
        <clock> 
         <eval><![CDATA[result("," + $convert(val(tmp1)))]]></eval> 
        </clock> 
       </for> 
       <for> 
        <incr>val(tmp1) -= 1</incr> 
        <clock> 
         <eval><![CDATA[result("," + $convert(val(tmp1)))]]></eval> 
        </clock> 
       </for> 
      </clock> 
     </clock> 
    </client> 
</ClientMetadata> 

У меня есть POJO, в котором я храню мой выше модель -

public class ModelMetadata { 

    private int modelId; 
    private String modelValue; // this string will have my above XML data as string 

    // setters and getters here 

} 

Теперь то, что это лучший способ, чтобы определить, является ли моя модель internal-flag установить, как верно или нет?

// this list will have all my Models stored 
List<ModelMetadata> metadata = getModelMetadata(); 

for (ModelMetadata model : metadata) { 
    // my model will be stored in below variable in XML format 
    String modelValue = model.getModelValue(); 

    // now parse modelValue variable and extract `internal-flag` field property 
} 

Нужно ли использовать XML-синтаксический анализ для этого или есть ли лучший способ сделать это?

Обновление: -

Я начал использовать Stax, и это то, что я пытался до сих пор, но не знаю, как я могу извлечь это поле -

InputStream is = new ByteArrayInputStream(modelValue.getBytes()); 

XMLStreamReader r = XMLInputFactory.newInstance().createXMLStreamReader(is); 
while(r.hasNext()) { 
    // now what should I do here? 
} 
+0

Как ваш bean-компонент заполняется из XML? Как вы получаете все остальные поля (например, «имя»)? – Thilo

+0

@Thilo, на данный момент я ничего не делаю с XML. В моем классе ModelMetadata есть переменная, называемая 'modelValue' - эта переменная хранит мой XML в строковом формате, так как это означает, что мне нужно использовать' String modelValue = model.getModelValue(); 'для выполнения XML разбор. – john

+0

Для параметров анализа XML см. Это http://stackoverflow.com/questions/23509480/how-to-extract-values-from-below-xml-code-using-java?rq=1 – Thilo

ответ

4

Существует простое решение с использованием XMLBeam (Раскрытие информации: Я аффилированные с этим проектом), всего несколько строк:

public class ReadBoolean { 
    public interface ClientMetaData { 
     @XBRead("//xbdefaultns:internal-flag") 
     boolean hasFlag(); 
    } 
    public static void main(String[] args) throws IOException { 
     ClientMetaData clientMetaData = new XBProjector().io().url("res://xmlWithBoolean.xml").read(ClientMetaData.class);  
     System.out.println("Has flag:"+clientMetaData.hasFlag()); 
    } 
} 

Эта программа печатает из

Has flag:true 

для вашего XML.

+0

XMLBeam выглядит хорошо для быстрого чтения нескольких полей из XML. Спасибо, что указали это. – user949300

0

Вы можете также сделать несколько простых синтаксический анализ строк, но это будет работать только для небольших случаев с правильным XML и если есть только один элемент <internal-flag>.

Это простой способ решить эту проблему, не используя утилиты для анализа XML. Другие решения могут быть более надежными или мощными.

  1. Найти индекс строкового литерала <internal-flag>. Если он не существует, верните false.
  2. Идти вперед "<internal-flag>".length (15) символов. Читайте до следующего </internal-flag>, который должен быть строкой true или false.
  3. Возьмите эту строку, используйте Boolean.parseBoolean(String), чтобы получить логическое значение.

Если вы хотите, чтобы я помог вам с кодом, просто оставьте комментарий!

+0

Я не думаю, что это хорошая идея. Даже когда вы полностью контролируете процесс генерации XML. Такие вещи, как XPath, не так уж сложно использовать. – Thilo

+0

Наверное, нет. Это быстрое и грязное решение, но оно работает. –

+0

Строка разбора xml никогда не является хорошим советом. Вам нужно позаботиться о кодировании и убедиться, что строка поиска не закомментирована и не содержит других вещей. В конце концов, вы сами создаете XML-парсер. И это плохая идея. – Cfx

0

Если вы желаете рассмотреть возможность добавления Groovy в ваш микс (например, см. Книгу Создание Java Groovy), то использование Groovy XMLParser и связанных классов сделает это простым.

Если вам нужно придерживаться Java, позвольте мне поставить бесстыдную штепсельную вилку для моего Xen library, которая имитирует много «Groovy way».Ответ на ваш вопрос будет:

Xen doc = new XenParser().parseText(YOUR_XML_STRING); 
String internalFlag = doc.getText(".client.internal-flag"); 
boolean isSet = "true".equals(internalFlag); 

Если XML исходит из файла, поток или URI, который может быть обработан тоже.

Caveat emptor, (хотя это бесплатно), это довольно новая библиотека, написанная исключительно случайным человеком (мной) и не полностью протестированная на всех сумасшедших XML. Если кто-нибудь знает о подобной, более «основной» библиотеке, мне было бы очень интересно услышать об этом.

Смежные вопросы