Как распечатать только некоторые элементы из текстового файла с тегами xml в новый текстовый файл?

1

Мне нужна помощь с чем-то, что звучит легко, но вызвало у меня проблемы.

У меня есть текстовый файл (record.txt) с корневым элементом "PatientRecord" и подтеками в нем ("имя", "возраст", тип крови, адрес и т.д.), Которые повторяются снова и снова, но с разными так как это запись для каждого человека. Мне только интересно распечатать значения между тегами в новый текстовый файл для каждого человека, но только для тех элементов, которые я хочу. Например, с тегами, о которых я говорил выше, мне нужно только имя и возраст, но не остальная информация для этого пациента. Как распечатать только те значения, разделенные запятыми, а затем перейти к следующему пациенту? Вот код, который у меня есть.

    package patient.records;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.OutputStreamWriter;
import java.io.Writer;
public class ProcessRecords {
private static final String FILE = "C:\\Users\\Desktop\\records.txt";
private static final String RECORD_START_TAG = "<PatientRecord>";
private static final String RECORD_END_TAG = "</PatientRecord>"; 
private static final String newFileName = "C:\\Users\\Desktop\\DataFolder\\";    
public static void main(String[] args) throws Exception {
    String scan;    
    FileReader file = new FileReader(FILE);
    BufferedReader br = new BufferedReader(file);
    Writer writer = null;

    while ((scan = br.readLine()) != null)        
    {            
        if (scan.contains(RECORD_START_TAG)) { 


            //This is the logic I am missing that will only grab the element values
            //between the tags inside of the file

            writer = new BufferedWriter(new OutputStreamWriter(
            new FileOutputStream(newFileName + "Record Data" + ".txt"), "utf-8"));             
            }      
        else if (scan.contains(RECORD_END_TAG)) {
            writer.close();
            writer=null;
        }
        else {
            // only write if writer is not null
           if (writer!=null) {
            writer.write(scan);
           }
        }            
    }       
    br.close();
    }   
}   //This is the end of my code             

Текстовый файл (record.txt), который я читаю, выглядит следующим образом:

<PatientRecord> <---first patient record--->
<---XML Schema goes here--->
            <Info>
                <age>66</age>
                <first_name>john</first_name>
                <last_name>smith</last_name>
                <mailing_address>200 main street</mailing_address>
                <blood_type>AB</blood_type>
                <phone_number>000-000-0000</phone_number>
</PatientRecord>
<PatientRecord> <---second patient record--->
<---XML Schema goes here--->
            <Info>
                <age>27</age>
                <first_name>micheal</first_name>
                <last_name>thompson</last_name>
                <mailing_address>123 baker street</mailing_address>
                <blood_type>O</blood_type>
                <phone_number>111-222-3333</phone_number>
</PatientRecord>

Поэтому в теории, если я ТОЛЬКО хотел распечатать значения из имени, почтового адреса и типа крови из этого текстового файла для всех пациентов, он должен выглядеть так:

john, 200 main street, AB
//this line is blank
michael, 123 baker street, O

Спасибо за любую помощь. Если вы чувствуете, что мой код должен быть изменен, я все для этого. Спасибо.

  • 0
    Является ли текстовое смешанное содержимое таким же или заключено в родительский тег?
Теги:
output
text

2 ответа

0
Лучший ответ

Мое первое чувство кишки состоит в том, чтобы обернуть весь текстовый контент вокруг некоторого внешнего тега и обработать текст как XML, что-то вроде...

<Patients>
    <PatientRecord> <---first patient record--->
        <Info>
            <age>66</age>
            <first_name>john</first_name>
            <last_name>smith</last_name>
            <mailing_address>200 main street</mailing_address>
            <blood_type>AB</blood_type>
            <phone_number>000-000-0000</phone_number>
    </PatientRecord>
    ...
</Patients>

Но есть две проблемы с этим...

Один <---first patient record---> не является допустимым XML-комментарием или текстом и двумя, нет закрывающего </Info>... [sigh]

Итак, моя следующая мысль была прочитана в каждом <PatientRecord> качестве текста, а затем обработала это как XML....

Здесь возникают проблемы... нам нужно удалить что-нибудь, окруженное <---... ---> включая маленькие стрелки... Есть много предположений об этом, но, надеюсь, мы можем его игнорировать...

Следующая проблема: нам нужно вставить закрывающий </Info>...

После этого все очень просто...

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.xml.sax.SAXException;

public class Test {

    private static final String RECORD_START_TAG = "<PatientRecord>";
    private static final String RECORD_END_TAG = "</PatientRecord>";

    public static void main(String[] args) {
        File records = new File("Records.txt");
        try (BufferedReader br = new BufferedReader(new FileReader(records))) {
            StringBuilder record = null;
            String text = null;
            while ((text = br.readLine()) != null) {

                if (text.contains("<---") && text.contains("--->")) {
                    String start = text.substring(0, text.indexOf("<---"));
                    String end = text.substring(text.indexOf("--->") + 4);
                    text = start + end;
                }

                if (text.trim().length() > 0) {
                    if (text.startsWith(RECORD_START_TAG)) {

                        record = new StringBuilder(128);
                        record.append(text);

                    } else if (text.startsWith(RECORD_END_TAG)) {

                        record.append("</Info>");
                        record.append(text);

                        try (ByteArrayInputStream bais = new ByteArrayInputStream(record.toString().getBytes())) {

                            Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(bais);
                            XPath xPath = XPathFactory.newInstance().newXPath();
                            XPathExpression exp = xPath.compile("PatientRecord/Info/first_name");
                            Node firstName = (Node) exp.evaluate(doc, XPathConstants.NODE);

                            exp = xPath.compile("PatientRecord/Info/mailing_address");
                            Node address = (Node) exp.evaluate(doc, XPathConstants.NODE);

                            exp = xPath.compile("PatientRecord/Info/blood_type");
                            Node bloodType = (Node) exp.evaluate(doc, XPathConstants.NODE);

                            System.out.println(
                                    firstName.getTextContent() + ", "
                                    + address.getTextContent() + ", "
                                    + bloodType.getTextContent());

                        } catch (ParserConfigurationException | XPathExpressionException | SAXException ex) {
                            ex.printStackTrace();
                        }

                    } else {

                        record.append(text);

                    }

                }

            }
        } catch (IOException exp) {
            exp.printStackTrace();
        }
    }

}

Что печатает...

john, 200 main street, AB
micheal, 123 baker street, O

Долго и коротко это, вернитесь к человеку, который дал вам этот файл, ударил их, а затем попросил, чтобы они ввели правильный формат XML...

  • 0
    спасибо за вашу помощь и извините за сумбур. «<--- первый пациент --->» был всего лишь моим комментарием, который позволил тому, кто мне помогал, узнать, что это была первая запись пациента в файле. У меня есть схема XML. Извините, я также пропустил закрывающий тег </ info>. Тем не менее, да, мне нужно было удалить тег «<firstname>» и отображать только имя john в выходном текстовом файле и т. Д. И т. Д. С другими тэгами. Я вижу, что это печатает на консоль, но как мне заставить это записать в текстовый файл? Поверьте мне, человек, который создал этот файл с тегами xml, уже был добавлен
  • 0
    Как вы делаете любой файл, проверьте Basic I / O для деталей. Лично я бы использовал BufferedWriter , но это я.
Показать ещё 7 комментариев
0

Используйте парсер DOM и проанализируйте текстовый файл. Вы можете увидеть один пример в этой ссылке

  • 0
    Текст не является допустимым форматом документа ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню